From f2176822899f170d1257bc4ba81d16feb39e9efb Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Mon, 12 May 2025 07:53:24 -0400 Subject: [PATCH] Implement & link m_cpmail_ovl --- configure.py | 2 +- include/m_card.h | 8 +- include/m_cpmail_ovl.h | 19 +- src/game/m_card.c | 4 +- src/game/m_cpmail_ovl.c | 456 ++++++++++++++++++++++++++++++++++++++++ src/game/m_tag_ovl.c | 22 +- 6 files changed, 483 insertions(+), 28 deletions(-) create mode 100644 src/game/m_cpmail_ovl.c diff --git a/configure.py b/configure.py index 8e334b20..5442c410 100644 --- a/configure.py +++ b/configure.py @@ -1391,7 +1391,7 @@ config.libs = [ Object(Matching, "game/m_controller.c"), Object(Matching, "game/m_cpak.c"), Object(Matching, "game/m_cpedit_ovl.c"), - Object(NonMatching, "game/m_cpmail_ovl.c"), + Object(Matching, "game/m_cpmail_ovl.c"), Object(NonMatching, "game/m_cporiginal_ovl.c"), Object(Matching, "game/m_cpwarning_ovl.c"), Object(Matching, "game/m_debug.c"), diff --git a/include/m_card.h b/include/m_card.h index 27ce1602..5f214212 100644 --- a/include/m_card.h +++ b/include/m_card.h @@ -140,25 +140,29 @@ typedef struct { #define mCD_KEEP_ORIGINAL_PAGE_COUNT 8 #define mCD_KEEP_ORIGINAL_COUNT 12 +#define mCD_KEEP_ORIGINAL_FOLDER_NAME_LEN 12 typedef struct { u16 checksum; u16 landid; - u8 _0004[mCD_KEEP_ORIGINAL_PAGE_COUNT][12]; + u8 folder_names[mCD_KEEP_ORIGINAL_PAGE_COUNT][mCD_KEEP_ORIGINAL_FOLDER_NAME_LEN]; mNW_original_design_c original[mCD_KEEP_ORIGINAL_PAGE_COUNT][mCD_KEEP_ORIGINAL_COUNT]; int _CC80; // force size to 0xCCA0 } mCD_keep_original_c ATTRIBUTE_ALIGN(32); #define mCD_KEEP_MAIL_PAGE_COUNT 8 #define mCD_KEEP_MAIL_COUNT 20 +#define mCD_KEEP_MAIL_FOLDER_NAME_LEN 12 typedef struct { u16 checksum; u16 landid; - u8 _0004[mCD_KEEP_MAIL_PAGE_COUNT][12]; + u8 folder_names[mCD_KEEP_MAIL_PAGE_COUNT][mCD_KEEP_MAIL_FOLDER_NAME_LEN]; Mail_c mail[mCD_KEEP_MAIL_PAGE_COUNT][mCD_KEEP_MAIL_COUNT]; } mCD_keep_mail_c ATTRIBUTE_ALIGN(32); +#define mCD_KEEP_MAIL_SIZE ALIGN_NEXT(sizeof(mCD_keep_mail_c), 32) + #define mCD_KEEP_DIARY_COUNT PLAYER_NUM #define mCD_KEEP_DIARY_ENTRY_COUNT lbRTC_MONTHS_MAX diff --git a/include/m_cpmail_ovl.h b/include/m_cpmail_ovl.h index 6c42be56..f36aa81f 100644 --- a/include/m_cpmail_ovl.h +++ b/include/m_cpmail_ovl.h @@ -4,29 +4,24 @@ #include "types.h" #include "m_cpmail_ovl_h.h" #include "m_submenu.h" +#include "m_card.h" #ifdef __cplusplus extern "C" { #endif -#define mCM_PAGE_COUNT 8 -#define mCM_MAIL_COUNT 20 -#define mCM_FOLDER_NAME_LEN 12 +// #define mCM_PAGE_COUNT 8 +// #define mCM_MAIL_COUNT 20 +// #define mCM_FOLDER_NAME_LEN 12 #define mCM_FOLDER_NAME_MAX_WIDTH 120 -/* TODO: move this to a better header */ -typedef struct card_mail_s { - int count; - u8 folder_names[mCM_PAGE_COUNT][mCM_FOLDER_NAME_LEN]; - Mail_c mail[mCM_PAGE_COUNT][mCM_MAIL_COUNT]; -} mCD_mail_c; - struct cpmail_ovl_s { - mCD_mail_c* card_mail; + mCD_keep_mail_c* card_mail; Mail_c player_mail[mPr_INVENTORY_MAIL_COUNT]; - u8 page_order[mCM_PAGE_COUNT]; + u8 page_order[mCD_KEEP_MAIL_PAGE_COUNT]; s16 page_move_timer; u8 next_page_id; + u8 _BB3; u32 mark_bitfield; int mark_flag; u8 _BBC; diff --git a/src/game/m_card.c b/src/game/m_card.c index 10ed2f8d..8e7bb57f 100644 --- a/src/game/m_card.c +++ b/src/game/m_card.c @@ -1605,7 +1605,7 @@ static void mCD_set_init_mail_data(u8* buf) { int j; for (i = 0; i < mCD_KEEP_MAIL_PAGE_COUNT; i++) { - mem_clear(keep_mail->_0004[i], sizeof(keep_mail->_0004[i]), CHAR_SPACE); + mem_clear(keep_mail->folder_names[i], sizeof(keep_mail->folder_names[i]), CHAR_SPACE); for (j = 0; j < mCD_KEEP_MAIL_COUNT; j++) { mMl_clear_mail(mail); mail++; @@ -1619,7 +1619,7 @@ static void mCD_set_init_original_data(u8* buf) { int j; for (i = 0; i < mCD_KEEP_ORIGINAL_PAGE_COUNT; i++) { - mem_clear(keep_original->_0004[i], sizeof(keep_original->_0004[i]), CHAR_SPACE); + mem_clear(keep_original->folder_names[i], sizeof(keep_original->folder_names[i]), CHAR_SPACE); for (j = 0; j < mCD_KEEP_ORIGINAL_COUNT; j++) { mNW_InitOriginalData(&keep_original->original[i][j]); } diff --git a/src/game/m_cpmail_ovl.c b/src/game/m_cpmail_ovl.c new file mode 100644 index 00000000..cc81b43a --- /dev/null +++ b/src/game/m_cpmail_ovl.c @@ -0,0 +1,456 @@ +#include "m_cpmail_ovl.h" + +#include "m_submenu_ovl.h" +#include "m_tag_ovl.h" +#include "m_hand_ovl.h" +#include "m_editEndChk_ovl.h" +#include "m_card.h" +#include "m_cpwarning_ovl.h" +#include "m_inventory_ovl.h" +#include "sys_matrix.h" +#include "m_editor_ovl.h" +#include "m_font.h" +#include "m_common_data.h" +#include "m_malloc.h" + +static mCM_Ovl_c cpmail_ovl_data; + +typedef struct { + Gfx* tag_gfx; + Gfx* color_gfx; + u16* pal_p; + u8* tex_p; + rgba_t title_color; +} mCM_disp_data_c; + +extern Gfx ctl_win1_color_mode[]; +extern Gfx ctl_win1_tagu1T_model[]; +extern Gfx ctl_win1_tagu2T_model[]; +extern Gfx ctl_win1_tagu3T_model[]; +extern Gfx ctl_win1_tagu4T_model[]; +extern Gfx ctl_win1_tagu5T_model[]; +extern Gfx ctl_win1_tagu6T_model[]; +extern Gfx ctl_win1_tagu7T_model[]; +extern Gfx ctl_win1_tagu8T_model[]; +extern Gfx ctl_win2_color_mode[]; +extern Gfx ctl_win3_color_mode[]; +extern Gfx ctl_win4_color_mode[]; +extern Gfx ctl_win5_color_mode[]; +extern Gfx ctl_win6_color_mode[]; +extern Gfx ctl_win7_color_mode[]; +extern Gfx ctl_win8_color_mode[]; +extern u8 ctl_win_nuno1_tex_rgb_ci4[]; +extern u16 ctl_win_nuno1_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno2_tex_rgb_ci4[]; +extern u16 ctl_win_nuno2_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno3_tex_rgb_ci4[]; +extern u16 ctl_win_nuno3_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno4_tex_rgb_ci4[]; +extern u16 ctl_win_nuno4_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno5_tex_rgb_ci4[]; +extern u16 ctl_win_nuno5_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno6_tex_rgb_ci4[]; +extern u16 ctl_win_nuno6_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno7_tex_rgb_ci4[]; +extern u16 ctl_win_nuno7_tex_rgb_ci4_pal[]; +extern u8 ctl_win_nuno8_tex_rgb_ci4[]; +extern u16 ctl_win_nuno8_tex_rgb_ci4_pal[]; + +static mCM_disp_data_c mCM_disp_data[8] = { + {ctl_win1_tagu1T_model, ctl_win1_color_mode, ctl_win_nuno1_tex_rgb_ci4_pal, ctl_win_nuno1_tex_rgb_ci4, { 0x46, 0x28, 0x14, 0xFF } }, + {ctl_win1_tagu2T_model, ctl_win2_color_mode, ctl_win_nuno2_tex_rgb_ci4_pal, ctl_win_nuno2_tex_rgb_ci4, { 0x14, 0x3C, 0x5A, 0xFF } }, + {ctl_win1_tagu3T_model, ctl_win3_color_mode, ctl_win_nuno3_tex_rgb_ci4_pal, ctl_win_nuno3_tex_rgb_ci4, { 0x3C, 0x1E, 0x46, 0xFF } }, + {ctl_win1_tagu4T_model, ctl_win4_color_mode, ctl_win_nuno4_tex_rgb_ci4_pal, ctl_win_nuno4_tex_rgb_ci4, { 0x0A, 0x46, 0x32, 0xFF } }, + {ctl_win1_tagu5T_model, ctl_win5_color_mode, ctl_win_nuno5_tex_rgb_ci4_pal, ctl_win_nuno5_tex_rgb_ci4, { 0x46, 0x32, 0x14, 0xFF } }, + {ctl_win1_tagu6T_model, ctl_win6_color_mode, ctl_win_nuno6_tex_rgb_ci4_pal, ctl_win_nuno6_tex_rgb_ci4, { 0x3C, 0x32, 0x46, 0xFF } }, + {ctl_win1_tagu7T_model, ctl_win7_color_mode, ctl_win_nuno7_tex_rgb_ci4_pal, ctl_win_nuno7_tex_rgb_ci4, { 0x46, 0x14, 0x1E, 0xFF } }, + {ctl_win1_tagu8T_model, ctl_win8_color_mode, ctl_win_nuno8_tex_rgb_ci4_pal, ctl_win_nuno8_tex_rgb_ci4, { 0x32, 0x46, 0x0A, 0xFF } }, +}; + +// lines 224-226 (3 lines) +static void mCM_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_Move_proc(submenu, menu_info); +} + +// lines 234-286 (53 lines) +static void mCM_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + + if (menu_info->open_flag == FALSE) { + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_CPMAIL, mTG_TYPE_NONE, 0, 0.0f, 0.0f); + menu_info->open_flag = TRUE; + } else if (cpmail_ovl->page_move_timer != 0) { + cpmail_ovl->page_move_timer--; + menu_info->position[1] = 100.0f * sinf_table(cpmail_ovl->page_move_timer * DEG2RAD(4.5f)); + if (cpmail_ovl->page_move_timer == 20) { + u8* page_order = cpmail_ovl->page_order; + int i; + + for (i = 0; i < mCD_KEEP_MAIL_PAGE_COUNT; i++, page_order++) { + if (*page_order == cpmail_ovl->next_page_id) { + break; + } + } + + for (i; i > 0; i--) { + page_order[0] = page_order[-1]; + page_order--; + } + + cpmail_ovl->page_order[0] = cpmail_ovl->next_page_id; + } else if (cpmail_ovl->page_move_timer == 0) { + menu_info->position[1] = 0.0f; + submenu->overlay->hand_ovl->set_hand_func(submenu); + submenu->overlay->tag_ovl->init_tag_data_item_win_proc(submenu); + } + } else { + submenu->overlay->menu_control.tag_move_func(submenu, menu_info); + } +} + +// lines 294-345 (52 lines) +static void mCM_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + mSM_MenuInfo_c* next_menu_info = &submenu->overlay->menu_info[menu_info->next_menu_type]; + + if (next_menu_info->proc_status == mSM_OVL_PROC_MOVE && next_menu_info->next_proc_status == mSM_OVL_PROC_END) { + if (next_menu_info->menu_type == mSM_OVL_EDITENDCHK) { + if (next_menu_info->data1 == 0) { + mCD_save_data_main_to_aram(cpmail_ovl->card_mail, mCD_KEEP_MAIL_SIZE, mCD_ARAM_DATA_MAIL); + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_OUT_RIGHT); + } else if (next_menu_info->data1 == 1) { + menu_info->proc_status = mSM_OVL_PROC_PLAY; + } else { + cpmail_ovl->_BB3 = 1; + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_OUT_RIGHT); + } + } else if (next_menu_info->menu_type == mSM_OVL_EDITOR) { + menu_info->proc_status = mSM_OVL_PROC_PLAY; + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + } else if (next_menu_info->menu_type == mSM_OVL_BOARD) { + menu_info->proc_status = mSM_OVL_PROC_MOVE; + menu_info->move_drt = mSM_MOVE_IN_LEFT; + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + } + } +} + +static void mCM_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_End_proc(submenu, menu_info); +} + +typedef void (*mCM_OVL_MOVE_PROC)(Submenu* submenu, mSM_MenuInfo_c* menu_info); + +static void mCM_cpmail_ovl_move(Submenu* submenu) { + static mCM_OVL_MOVE_PROC ovl_move_proc[] = { + // clang-format off + mCM_move_Move, + mCM_move_Play, + mCM_move_Wait, + (mCM_OVL_MOVE_PROC)none_proc1, + mCM_move_End, + // clang-format on + }; + + Submenu_Overlay_c* ovl = submenu->overlay; + mSM_MenuInfo_c* menu_info = &ovl->menu_info[mSM_OVL_CPMAIL]; + + 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) { + ovl->menu_control.animation_flag = TRUE; + } else { + ovl->menu_control.animation_flag = FALSE; + } +} + +extern Gfx inv_item_mode[]; + +static void mCM_set_mail(Submenu* submenu, GRAPH* graph, float pos_x, float pos_y, int page_num) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + Mail_c* mail = cpmail_ovl->card_mail->mail[page_num]; + int i; + int mark_bitfield = 0; + int mark_flag; + float pos[2]; + float scale; + + OPEN_POLY_OPA_DISP(graph); + + gSPDisplayList(POLY_OPA_DISP++, inv_item_mode); + + CLOSE_POLY_OPA_DISP(graph); + + if (inv_ovl != NULL && inv_ovl->remove_timer > 0 && (tag->table == mTG_TABLE_CPMAIL || cpmail_ovl->mark_flag == TRUE)) { + if (cpmail_ovl->mark_flag == TRUE) { + mark_bitfield = cpmail_ovl->mark_bitfield; + } else if (cpmail_ovl->mark_flag == FALSE) { + mark_bitfield = 1 << submenu->overlay->tag_ovl->get_table_idx_proc(tag); + } + } + + for (i = 0; i < mCD_KEEP_MAIL_COUNT; i++) { + if ((cpmail_ovl->mark_bitfield2 & (1 << i)) == 0 && mMl_check_not_used_mail(mail) != TRUE) { + if ((mark_bitfield & (1 << i)) != 0) { + scale = inv_ovl->remove_timer * (1.0f / 24.0f); + } else { + scale = 1.0f; + } + + if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0 && cpmail_ovl->mark_flag == FALSE) { + mark_flag = TRUE; + } else { + mark_flag = FALSE; + } + + submenu->overlay->tag_ovl->set_hand_pos_proc(submenu, pos, mTG_TABLE_CPMAIL, i); + submenu->overlay->draw_mail_proc(graph, pos_x + pos[0], pos_y + pos[1], scale, mail, TRUE, FALSE, mark_flag); + } + + mail++; + } +} + +static float mCM_get_page_posY(Submenu* submenu, mSM_MenuInfo_c* menu_info, int page_num) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + + if (cpmail_ovl->page_move_timer == 0 || page_num == cpmail_ovl->next_page_id) { + return menu_info->position[1]; + } else { + return -menu_info->position[1]; + } +} + +extern Gfx ctl_tag_mode[]; +extern Gfx ctl_win_mode[]; +extern Gfx ctl_win_model[]; +extern Gfx ctl_win1_kageT_model[]; +extern Gfx ctl_sentaku_taguT_model[]; + +static void mCM_set_page_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game, GRAPH* graph, int page_num, int flag) { + mCM_disp_data_c* disp_data_p = &mCM_disp_data[page_num]; + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + float pos_x = menu_info->position[0]; + float pos_y = mCM_get_page_posY(submenu, menu_info, page_num); + int tex_x; + int tex_y; + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(pos_x, pos_y, 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); + gSPSegment(POLY_OPA_DISP++, ANIME_1_TXT_SEG, disp_data_p->color_gfx); + + if (flag) { + gSPDisplayList(POLY_OPA_DISP++, ctl_win_mode); + gDPLoadTLUT_Dolphin(POLY_OPA_DISP++, 14, 16, 1, disp_data_p->pal_p); + gDPLoadTextureBlock_4b_Dolphin(POLY_OPA_DISP++, disp_data_p->tex_p, G_IM_FMT_CI, 32, 32, 14, GX_REPEAT, GX_REPEAT, 0, 0); + gDPTileSync(POLY_OPA_DISP++); + + tex_x = -submenu->overlay->menu_control.texture_pos[0] * 4.0f; + tex_y = -submenu->overlay->menu_control.texture_pos[1] * 4.0f; + gDPSetTileSize_Dolphin(POLY_OPA_DISP++, G_TX_RENDERTILE, (u8)tex_x, (u8)tex_y, 32, 32); + gSPDisplayList(POLY_OPA_DISP++, ctl_win_model); + } else { + gSPDisplayList(POLY_OPA_DISP++, ctl_tag_mode); + } + + gSPDisplayList(POLY_OPA_DISP++, disp_data_p->tag_gfx); + + if (flag) { + gSPDisplayList(POLY_OPA_DISP++, ctl_win1_kageT_model); + } + + if (cpmail_ovl->next_page_id == page_num) { + Matrix_translate(97.0f, 51.0f - 15.0f * page_num, 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++, ctl_sentaku_taguT_model); + } + + CLOSE_POLY_OPA_DISP(graph); + + if (flag) { + float str_x; + float str_y; + int len; + + mCM_set_mail(submenu, graph, pos_x, pos_y, page_num); + submenu->overlay->set_char_matrix_proc(graph); + + str_x = 160.0f + pos_x + 24.0f; + + if (menu_info->proc_status == mSM_OVL_PROC_WAIT && menu_info->next_menu_type == mSM_OVL_EDITOR) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + len = mCD_KEEP_MAIL_FOLDER_NAME_LEN; + if (editor_ovl != NULL) { + str_x -= editor_ovl->line_width * 0.5f; + } + } else { + len = mMl_strlen(cpmail_ovl->card_mail->folder_names[page_num], mCD_KEEP_MAIL_FOLDER_NAME_LEN, CHAR_SPACE); + str_x -= mFont_GetStringWidth(cpmail_ovl->card_mail->folder_names[page_num], len, TRUE) * 0.5f; + } + + str_y = 120.0f - ((pos_y + 84.0f) - 5.0f); + mFont_SetLineStrings( + // clang-format off + game, + cpmail_ovl->card_mail->folder_names[page_num], len, + str_x, str_y, + disp_data_p->title_color.r, disp_data_p->title_color.g, disp_data_p->title_color.b, 255, + FALSE, TRUE, + 1.0f, 1.0f, + mFont_MODE_POLY + // clang-format on + ); + + if (menu_info->proc_status == mSM_OVL_PROC_WAIT && menu_info->next_menu_type == mSM_OVL_EDITOR) { + mED_Ovl_c* editor_ovl = submenu->overlay->editor_ovl; + + if (editor_ovl != NULL) { + editor_ovl->cursol_draw(submenu, game, str_x + editor_ovl->_26 + -6.0f, str_y); + } + } + } +} + +static void mCM_set_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game) { + GRAPH* graph = game->graph; + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + int i; + int flag; + u8* page_order_p = &cpmail_ovl->page_order[mCD_KEEP_MAIL_PAGE_COUNT - 1]; + + for (i = mCD_KEEP_MAIL_PAGE_COUNT - 1; i >= 0; i--, page_order_p--) { + if (i == 0 || *page_order_p == cpmail_ovl->next_page_id || (i == 1 && page_order_p[-1] == cpmail_ovl->next_page_id)) { + flag = TRUE; + } else { + flag = FALSE; + } + + mCM_set_page_dl(submenu, menu_info, game, graph, *page_order_p, flag); + } + + if (cpmail_ovl->page_move_timer == 0) { + submenu->overlay->menu_control.tag_draw_func(submenu, game, mSM_OVL_CPMAIL); + } +} + +static void mCM_cpmail_ovl_draw(Submenu* submenu, GAME* game) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPMAIL]; + + if (submenu->overlay->cpmail_ovl != NULL) { + menu_info->pre_draw_func(submenu, game); + mCM_set_dl(submenu, menu_info, game); + } +} + +static void mCM_cpmail_draw_init(mSM_MenuInfo_c* menu_info) { + mCM_disp_data_c* disp_data_p = &mCM_disp_data[0]; + int i; + + for (i = 0; i < mCD_KEEP_MAIL_PAGE_COUNT; i++) { + disp_data_p->color_gfx = (Gfx*)disp_data_p->color_gfx; + disp_data_p->pal_p = (u16*)disp_data_p->pal_p; + disp_data_p->tex_p = (u8*)disp_data_p->tex_p; + disp_data_p++; + } +} + +extern void mCM_cpmail_ovl_set_proc(Submenu* submenu) { + Submenu_Overlay_c* ovl = submenu->overlay; + mSM_Control_c* ctrl = &ovl->menu_control; + + ctrl->menu_move_func = mCM_cpmail_ovl_move; + ctrl->menu_draw_func = mCM_cpmail_ovl_draw; + if (ovl->hand_ovl != NULL && ovl->menu_info[mSM_OVL_CPMAIL].next_proc_status != mSM_OVL_PROC_END) { + submenu->overlay->hand_ovl->set_hand_func(submenu); + } +} + +static void mCM_cpmail_load_memory(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + + mCD_save_data_aram_to_main(cpmail_ovl->card_mail, mCD_KEEP_MAIL_SIZE, mCD_ARAM_DATA_MAIL); +} + +static void mCM_cpmail_ovl_init(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + Mail_c* player_mail = cpmail_ovl->player_mail; + Mail_c* mail = Now_Private->mail; + u8* page_order_p; + u8* title_p; + int i; + + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + mMl_copy_mail(player_mail, mail); + player_mail++; + mail++; + } + + page_order_p = cpmail_ovl->page_order; + for (i = 0; i < mCD_KEEP_MAIL_PAGE_COUNT; i++, page_order_p++) { + *page_order_p = i; + } + + mail = cpmail_ovl->card_mail->mail[0]; + for (i = 0; i < mCD_KEEP_MAIL_COUNT * mCD_KEEP_MAIL_PAGE_COUNT; i++) { + mMl_clear_mail(mail); + mail++; + } + + title_p = cpmail_ovl->card_mail->folder_names[0]; + for (i = 0; i < mCD_KEEP_MAIL_PAGE_COUNT; i++) { + mem_clear(title_p, mCD_KEEP_MAIL_FOLDER_NAME_LEN, CHAR_SPACE); + title_p += mCD_KEEP_MAIL_FOLDER_NAME_LEN; + } + + cpmail_ovl->_BB3 = 0; + mCM_cpmail_load_memory(submenu, menu_info); + submenu->item_p->slot_no = 1; + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_IN_RIGHT); +} + +extern void mCM_cpmail_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* ovl = submenu->overlay; + mSM_MenuInfo_c* menu_info = &ovl->menu_info[mSM_OVL_CPMAIL]; + + if (ovl->cpmail_ovl == NULL) { + mem_clear((u8*)&cpmail_ovl_data, sizeof(cpmail_ovl_data), 0); + ovl->cpmail_ovl = &cpmail_ovl_data; + cpmail_ovl_data.card_mail = (mCD_keep_mail_c*)zelda_malloc_align(mCD_KEEP_MAIL_SIZE, 32); + mem_clear((u8*)cpmail_ovl_data.card_mail, mCD_KEEP_MAIL_SIZE, 0); + mCM_cpmail_draw_init(menu_info); + } + + mCM_cpmail_ovl_init(submenu, menu_info); + mCM_cpmail_ovl_set_proc(submenu); +} + +extern void mCM_cpmail_ovl_destruct(Submenu* submenu) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + Mail_c* player_mail; + Mail_c* mail; + int i; + + if (cpmail_ovl->_BB3 != 0) { + mail = Now_Private->mail; + player_mail = cpmail_ovl->player_mail; + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + mMl_copy_mail(mail, player_mail); + player_mail++; + mail++; + } + } + + if (cpmail_ovl_data.card_mail != NULL) { + zelda_free(cpmail_ovl_data.card_mail); + cpmail_ovl_data.card_mail = NULL; + } + + submenu->overlay->cpmail_ovl = NULL; +} diff --git a/src/game/m_tag_ovl.c b/src/game/m_tag_ovl.c index 94ee275c..584a526b 100644 --- a/src/game/m_tag_ovl.c +++ b/src/game/m_tag_ovl.c @@ -2040,8 +2040,8 @@ static void mTG_init_tag_data_cpmail_wc_win(Submenu* submenu, int folder_idx) { mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; int len; - mem_copy(tag->str0, cpmail_ovl->card_mail->folder_names[folder_idx], mCM_FOLDER_NAME_LEN); - len = mMl_strlen(tag->str0, mCM_FOLDER_NAME_LEN, CHAR_SPACE); + mem_copy(tag->str0, cpmail_ovl->card_mail->folder_names[folder_idx], mCD_KEEP_MAIL_FOLDER_NAME_LEN); + len = mMl_strlen(tag->str0, mCD_KEEP_MAIL_FOLDER_NAME_LEN, CHAR_SPACE); if (len <= 0 || cpmail_ovl->page_order[0] == tag->tag_row) { tag->arrow_dir = 0; @@ -3356,7 +3356,7 @@ static void mTG_dump_mail_mark_exe_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i } else if (menu_info->menu_type == mSM_OVL_CPMAIL) { int page = cpmail_ovl->page_order[0]; - for (i = 0; i < mCM_MAIL_COUNT; i++) { + for (i = 0; i < mCD_KEEP_MAIL_COUNT; i++) { Mail_c* mail = &cpmail_ovl->card_mail->mail[page][i]; // clear selected mail if it has a present or is from the player (sending) @@ -3447,7 +3447,7 @@ static void mTG_cpmail_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i } cpmail_mark_cnt = 0; - for (i = 0; i < mCM_MAIL_COUNT; i++) { + for (i = 0; i < mCD_KEEP_MAIL_COUNT; i++) { if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0) { cpmail_mark_cnt++; } @@ -3462,7 +3462,7 @@ static void mTG_cpmail_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i cpmail_free_cnt = 0; page = cpmail_ovl->page_order[0]; - for (i = 0; i < mCM_MAIL_COUNT; i++) { + for (i = 0; i < mCD_KEEP_MAIL_COUNT; i++) { if (mMl_check_not_used_mail(&cpmail_ovl->card_mail->mail[page][i]) == TRUE) { cpmail_free_cnt++; } @@ -3493,7 +3493,7 @@ static void mTG_cpmail_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i } if (cpmail_cnt > 0) { - for (cnt = 0, i = 0; cnt < cpmail_cnt && i < mCM_MAIL_COUNT; i++) { + for (cnt = 0, i = 0; cnt < cpmail_cnt && i < mCD_KEEP_MAIL_COUNT; i++) { if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0) { cpmail_ovl->mark_bitfield &= ~(1 << i); cnt++; @@ -4462,7 +4462,7 @@ static int mTG_mark_main_sub(Submenu* submenu, int menu_type, int param, int tab *(u32**)mark_bitfield_p = &cpmail_ovl->mark_bitfield; updated_mark_bitfield->field32 = 1 << table_idx; - *max_mark_count = mCM_MAIL_COUNT; + *max_mark_count = mCD_KEEP_MAIL_COUNT; } else { return FALSE; } @@ -5541,7 +5541,7 @@ static void mTG_cpack_change_mail_mark_decide(Submenu* submenu, mIV_Ovl_c* inv_o cpmail_free_idx = -1; cpmail_move_mail = NULL; cpmail_free_mail = NULL; - for (i = 0; i < mCM_MAIL_COUNT; i++, cpmail_mail++) { + for (i = 0; i < mCD_KEEP_MAIL_COUNT; i++, cpmail_mail++) { if (cpmail_move_idx < 0 && (cpmail_ovl->mark_bitfield & (1 << i)) != 0) { cpmail_move_mail = cpmail_mail; cpmail_move_idx = i; @@ -6993,7 +6993,7 @@ static int mTG_select_tag_decide_cpmail_wchange(Submenu* submenu, mSM_MenuInfo_c static int mTG_select_tag_decide_cpmail_title(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; - mSM_open_submenu_new2(submenu, mSM_OVL_EDITOR, mED_TYPE_CP_TITLE, mCM_FOLDER_NAME_LEN, + mSM_open_submenu_new2(submenu, mSM_OVL_EDITOR, mED_TYPE_CP_TITLE, mCD_KEEP_MAIL_FOLDER_NAME_LEN, &cpmail_ovl->card_mail->folder_names[cpmail_ovl->page_order[0]], mCM_FOLDER_NAME_MAX_WIDTH); menu_info->proc_status = mSM_OVL_PROC_WAIT; submenu->overlay->hand_ovl->nop_hand_func(submenu); @@ -7613,7 +7613,7 @@ static void mTG_move_change(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag mTG_init_tag_data(submenu, mTG_TABLE_CATALOG, mTG_TYPE_NONE, 0.0f, 0.0f, 0, 0); } else if (menu_info->menu_type == mSM_OVL_CPMAIL) { row = tag->tag_row; - tag->tag_row = (submenu->overlay->cpmail_ovl->page_order[0] + 1) % mCM_PAGE_COUNT; + tag->tag_row = (submenu->overlay->cpmail_ovl->page_order[0] + 1) % mCD_KEEP_MAIL_PAGE_COUNT; mTG_select_tag_decide_cpmail_wchange(submenu, menu_info, tag); tag->tag_row = row; } else if (menu_info->menu_type == mSM_OVL_CPORIGINAL) { @@ -7879,7 +7879,7 @@ static void mTG_move_delete(Submenu* submenu, mTG_tag_c* tag) { int i; int page = cpmail_ovl->page_order[0]; - for (i = 0; i < mCM_MAIL_COUNT; i++) { + for (i = 0; i < mCD_KEEP_MAIL_COUNT; i++) { if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0) { mMl_clear_mail(&cpmail_ovl->card_mail->mail[page][i]); }