From e28739996d43eb4059121c73d5a055989b5bc944 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Wed, 14 May 2025 06:53:01 -0400 Subject: [PATCH] Implement & link m_cporiginal_ovl, last submenu overlay --- configure.py | 2 +- include/m_card.h | 2 + include/m_cporiginal_ovl.h | 23 +- src/game/m_cporiginal_ovl.c | 790 ++++++++++++++++++++++++++++++++++++ 4 files changed, 806 insertions(+), 11 deletions(-) create mode 100644 src/game/m_cporiginal_ovl.c diff --git a/configure.py b/configure.py index a15cdc74..c6989770 100644 --- a/configure.py +++ b/configure.py @@ -1392,7 +1392,7 @@ config.libs = [ Object(Matching, "game/m_cpak.c"), Object(Matching, "game/m_cpedit_ovl.c"), Object(Matching, "game/m_cpmail_ovl.c"), - Object(NonMatching, "game/m_cporiginal_ovl.c"), + Object(Matching, "game/m_cporiginal_ovl.c"), Object(Matching, "game/m_cpwarning_ovl.c"), Object(Matching, "game/m_debug.c"), Object(Matching, "game/m_debug_display.c"), diff --git a/include/m_card.h b/include/m_card.h index 2a208338..5ee558f7 100644 --- a/include/m_card.h +++ b/include/m_card.h @@ -150,6 +150,8 @@ typedef struct { int _CC80; // force size to 0xCCA0 } mCD_keep_original_c ATTRIBUTE_ALIGN(32); +#define mCD_KEEP_ORIGINAL_SIZE ALIGN_NEXT(sizeof(mCD_keep_original_c), 32) + #define mCD_KEEP_MAIL_PAGE_COUNT 8 #define mCD_KEEP_MAIL_COUNT 20 #define mCD_KEEP_MAIL_FOLDER_NAME_LEN 12 diff --git a/include/m_cporiginal_ovl.h b/include/m_cporiginal_ovl.h index e8660ada..6c80ace0 100644 --- a/include/m_cporiginal_ovl.h +++ b/include/m_cporiginal_ovl.h @@ -4,6 +4,7 @@ #include "types.h" #include "m_cporiginal_ovl_h.h" #include "m_submenu_ovl.h" +#include "m_card.h" #ifdef __cplusplus extern "C" { @@ -15,29 +16,31 @@ extern "C" { #define mCO_FOLDER_NAME_MAX_WIDTH 120 /* TODO: find a better place for this */ -typedef struct card_original_s { - int count; - u8 folder_names[mCO_PAGE_NUM][mCO_FOLDER_NAME_LEN]; - mNW_original_design_c original[mCO_PAGE_NUM][mCO_ORIGINAL_NUM]; - int _CC80; -} mCD_original_c; +// typedef struct card_original_s { +// int count; +// u8 folder_names[mCO_PAGE_NUM][mCO_FOLDER_NAME_LEN]; +// mNW_original_design_c original[mCO_PAGE_NUM][mCO_ORIGINAL_NUM]; +// int _CC80; +// } mCD_original_c; struct cporiginal_s { - mCD_original_c* card_original; + mCD_keep_original_c* card_original; u8 page_order[mCO_PAGE_NUM]; + s16 timer; u8 up_folder; - u8 chang_flg; + u8 change_flg; int _10; u16 mark_flg; u16 hide_flg[mCO_PAGE_NUM]; u8 _26; u8 cloth_org_no; u8 cloth_org_idx; - u8 image_order[mCO_PAGE_NUM][mCO_ORIGINAL_NUM + 1]; + u8 image_order[104]; }; +extern int mCO_get_change_flg(void); extern void mCO_swap_image(Submenu* submenu, mActor_name_t item0, mActor_name_t item1); -extern void mCO_change_up_folder(Submenu* submenu, int idx); +extern int mCO_change_up_folder(Submenu* submenu, int idx); extern int mCO_top_folder(Submenu* submenu); extern u8* mCO_get_folder_name(Submenu* submenu, int folder); extern u8* mCO_get_image_name(Submenu* submenu, int folder, int idx); diff --git a/src/game/m_cporiginal_ovl.c b/src/game/m_cporiginal_ovl.c new file mode 100644 index 00000000..d374429f --- /dev/null +++ b/src/game/m_cporiginal_ovl.c @@ -0,0 +1,790 @@ +#include "m_cporiginal_ovl.h" + +#include "m_submenu_ovl.h" +#include "m_common_data.h" +#include "sys_matrix.h" +#include "m_font.h" +#include "m_editEndChk_ovl.h" +#include "m_editor_ovl.h" +#include "m_needlework_ovl.h" +#include "m_tag_ovl.h" +#include "m_hand_ovl.h" +#include "m_malloc.h" + +static mCO_Ovl_c co_ovl_data; + +// clang-format off +static rgb8_t env_table[mCO_PAGE_NUM] = { + {0xFF, 0xF5, 0xA0}, + {0xFF, 0xD7, 0x96}, + {0xF5, 0xC3, 0x82}, + {0xE1, 0xAF, 0x6E}, + {0xCD, 0x9B, 0x5A}, + {0xB9, 0x87, 0x46}, + {0xA5, 0x73, 0x32}, + {0x9B, 0x5F, 0x28}, +}; +// clang-format on + +static int mCO_check_pat_idx(int pat_idx) { + int ret = TRUE; + + if (pat_idx < 8 || pat_idx >= 104) { + ret = FALSE; + } + + return ret; +} + +extern int mCO_get_change_flg(void) { + return co_ovl_data.change_flg; +} + +static int mCO_pat_idx_to_folder(int pat_idx) { + return (pat_idx - 8) / mCO_ORIGINAL_NUM; +} + +static int mCO_pat_idx_to_idx(int pat_idx) { + return (pat_idx - 8) % mCO_ORIGINAL_NUM; +} + +extern int mCO_top_folder(Submenu* submenu) { + return submenu->overlay->cporiginal_ovl->page_order[0]; +} + +extern int mCO_check_mark_flg(Submenu* submenu, int idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int ret = FALSE; + + if (idx >= 0 && idx < mCO_ORIGINAL_NUM) { + u16 flg = 1 << idx; + + if (cporiginal_ovl->mark_flg & flg) { + ret = TRUE; + } + } + + return ret; +} + +extern void mCO_clear_mark_flg(Submenu* submenu) { + submenu->overlay->cporiginal_ovl->mark_flg = 0; +} + +extern int mCO_check_hide_flg(Submenu* submenu, int folder, int idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + u16 flg = 1 << idx; + int ret = FALSE; + + if (cporiginal_ovl->hide_flg[folder] & flg) { + ret = TRUE; + } + + return ret; +} + +extern void mCO_on_hide_flg(Submenu* submenu, int folder, int idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + u16 flg = 1 << idx; + + cporiginal_ovl->hide_flg[folder] |= flg; +} + +extern void mCO_clear_hide_flg(Submenu* submenu) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int i; + + for (i = 0; i < mCO_PAGE_NUM; i++) { + cporiginal_ovl->hide_flg[i] = 0; + } +} + +extern int mCO_change_up_folder(Submenu* submenu, int folder) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int ret = FALSE; + + if (folder < mCO_PAGE_NUM && folder != cporiginal_ovl->page_order[0]) { + cporiginal_ovl->timer = 40; + cporiginal_ovl->up_folder = folder; + ret = TRUE; + } + + return ret; +} + +static mNW_original_tex_c* mCO_get_texture(Submenu* submenu, int folder, int idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + return &cporiginal_ovl->card_original->original[folder][idx].design; +} + +extern mNW_original_tex_c sav_nuki_tex; + +static mNW_original_tex_c* mCO_get_texture_pat_idx(Submenu* submenu, int pat_idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + mNW_original_tex_c* tex = &sav_nuki_tex; + + if (mCO_check_pat_idx(pat_idx)) { + int folder = mCO_pat_idx_to_folder(pat_idx); + int idx = mCO_pat_idx_to_idx(pat_idx); + + tex = mCO_get_texture(submenu, folder, idx); + } + + return tex; +} + +static int mCO_get_pallet_no(Submenu* submenu, int folder, int idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + return cporiginal_ovl->card_original->original[folder][idx].palette; +} + +static int mCO_get_pallet_no_pat_idx(Submenu* submenu, int pat_idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int ret = 0; + + if (mCO_check_pat_idx(pat_idx)) { + int folder = mCO_pat_idx_to_folder(pat_idx); + int idx = mCO_pat_idx_to_idx(pat_idx); + + ret = mCO_get_pallet_no(submenu, folder, idx); + } + + return ret; +} + +extern Gfx inv_md_base_model_before[]; +extern Gfx inv_md_base_model_b[]; + +extern void mCO_draw_cporiginal(Submenu* submenu, GRAPH* graph, f32 pos_x, f32 pos_y, f32 scale, int idx, + int color_flag) { + if (scale < 0.05f) { + return; + } + + OPEN_POLY_OPA_DISP(graph); + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(pos_x, pos_y, 140.0f, 1); + Matrix_scale(scale, scale, 1.0f, 1); + + 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, mCO_get_texture_pat_idx(submenu, idx)); + gSPSegment(POLY_OPA_DISP++, ANIME_2_TXT_SEG, mNW_PaletteIdx2Palette(mCO_get_pallet_no_pat_idx(submenu, idx))); + + if (color_flag) { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, 0, 0, 0, 80); + } else { + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, 255, 255, 255, 255); + } + + gSPDisplayList(POLY_OPA_DISP++, inv_md_base_model_before); + gSPDisplayList(POLY_OPA_DISP++, inv_md_base_model_b); + + CLOSE_POLY_OPA_DISP(graph); +} + +extern u8* mCO_get_folder_name(Submenu* submenu, int folder) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + return cporiginal_ovl->card_original->folder_names[folder]; +} + +extern u8* mCO_get_image_name(Submenu* submenu, int folder, int idx) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + return cporiginal_ovl->card_original->original[folder][idx].name; +} + +static mNW_original_design_c* mCO_itemNo_to_data(Submenu* submenu, mActor_name_t itemNo) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int pat_idx = itemNo - RSV_NW_ORIGINAL0; + int folder = mCO_pat_idx_to_folder(pat_idx); + int idx = mCO_pat_idx_to_idx(pat_idx); + + return &cporiginal_ovl->card_original->original[folder][idx]; +} + +static void mCO_swap_image_2(Submenu* submenu, mActor_name_t itemNo1, mActor_name_t itemNo2) { + mNW_original_design_c* org1 = mNW_get_image_data(submenu, itemNo1 - RSV_NW_ORIGINAL0); + mNW_original_design_c* org2 = mCO_itemNo_to_data(submenu, itemNo2); + + mNW_SwapOriginalData(org2, org1); +} + +extern void mCO_swap_image(Submenu* submenu, mActor_name_t itemNo1, mActor_name_t itemNo2) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + if (ITEM_IS_RSVNWORG(itemNo1) && ITEM_IS_RSVNWORG(itemNo2)) { + mNW_swap_image_no(submenu, itemNo1 - RSV_NW_ORIGINAL0, itemNo2 - RSV_NW_ORIGINAL0); + } else if (ITEM_IS_RSVCPORG(itemNo1) && ITEM_IS_RSVCPORG(itemNo2)) { + mNW_SwapOriginalData(mCO_itemNo_to_data(submenu, itemNo1), mCO_itemNo_to_data(submenu, itemNo2)); + } else if (ITEM_IS_RSVNWORG(itemNo1) && ITEM_IS_RSVCPORG(itemNo2)) { + mCO_swap_image_2(submenu, itemNo1, itemNo2); + } else if (ITEM_IS_RSVNWORG(itemNo2) && ITEM_IS_RSVCPORG(itemNo1)) { + mCO_swap_image_2(submenu, itemNo2, itemNo1); + } + + if (cporiginal_ovl != NULL) { + u8 tmp = cporiginal_ovl->image_order[itemNo1 - RSV_NW_ORIGINAL0]; + cporiginal_ovl->image_order[itemNo1 - RSV_NW_ORIGINAL0] = cporiginal_ovl->image_order[itemNo2 - RSV_NW_ORIGINAL0]; + cporiginal_ovl->image_order[itemNo2 - RSV_NW_ORIGINAL0] = tmp; + } +} + +static void mCO_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_Move_proc(submenu, menu_info); +} + +static void mCO_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + if (menu_info->open_flag == FALSE) { + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_CPORIGINAL, mTG_TYPE_NONE, 0, 0.0f, 0.0f); + menu_info->open_flag = TRUE; + } else if (cporiginal_ovl->timer != 0) { + cporiginal_ovl->timer--; + menu_info->position[1] = 100.0f * sinf_table(cporiginal_ovl->timer * DEG2RAD(4.5f)); + + if (cporiginal_ovl->timer == 20) { + u8* page_order_p = cporiginal_ovl->page_order; + int i; + + for (i = 0; i < mCO_PAGE_NUM; i++, page_order_p++) { + if (*page_order_p == cporiginal_ovl->up_folder) { + break; + } + } + + for (i; i > 0; i--) { + *page_order_p = *(page_order_p - 1); + page_order_p--; + } + + cporiginal_ovl->page_order[0] = cporiginal_ovl->up_folder; + } else if (cporiginal_ovl->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); + } +} + +static void mCO_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + mSM_MenuInfo_c* next_menu = &submenu->overlay->menu_info[menu_info->next_menu_type]; + + if (next_menu->proc_status == mSM_OVL_PROC_MOVE && next_menu->next_proc_status == mSM_OVL_PROC_END) { + if (next_menu->menu_type == mSM_OVL_EDITENDCHK) { + if (next_menu->data1 == 0) { + mNW_next_data(submenu); + mCD_save_data_main_to_aram(cporiginal_ovl->card_original, mCD_KEEP_ORIGINAL_SIZE, mCD_ARAM_DATA_ORIGINAL); + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_OUT_RIGHT); + + if (Now_Private->cloth.idx >= (CLOTH_NUM + 1)) { + if (cporiginal_ovl->cloth_org_no != 255 && cporiginal_ovl->cloth_org_idx != 255) { + int idx = cporiginal_ovl->cloth_org_no; + int player_idx; + int i; + + for (i = 0; i < mPr_ORIGINAL_DESIGN_COUNT; i++) { + if (idx == mNW_get_image_no(submenu, i)) { + player_idx = i; + } + } + + if (cporiginal_ovl->image_order[player_idx] != cporiginal_ovl->cloth_org_idx) { + cporiginal_ovl->change_flg = TRUE; + } + } + } + } else if (next_menu->data1 == 1) { + menu_info->proc_status = mSM_OVL_PROC_PLAY; + } else { + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_OUT_RIGHT); + } + } else if (next_menu->menu_type == mSM_OVL_EDITOR) { + menu_info->proc_status = mSM_OVL_PROC_PLAY; + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + } + } +} + +static void mCO_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_End_proc(submenu, menu_info); +} + +static void mCO_cporiginal_ovl_move(Submenu* submenu) { + // clang-format off + static mSM_MOVE_PROC ovl_move_proc[] = { + mCO_move_Move, + mCO_move_Play, + mCO_move_Wait, + (mSM_MOVE_PROC)none_proc1, + mCO_move_End, + }; + // clang-format on + + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPORIGINAL]; + + menu_info->pre_move_func(submenu); + (*ovl_move_proc[menu_info->proc_status])(submenu, menu_info); +} + +extern Gfx sav_win1_taguT_model[]; +extern Gfx sav_win1_kage_model[]; + +static void mCO_set_frame_tagS_dl(Submenu* submenu, GAME* game, int folder) { + // clang-format off + static rgb8_t prim_table[mCO_PAGE_NUM] = { + {0xCD, 0xC3, 0x6E}, + {0xCD, 0xA5, 0x5F}, + {0xC3, 0x91, 0x4B}, + {0xAF, 0x7D, 0x37}, + {0x9B, 0x69, 0x23}, + {0x87, 0x5F, 0x14}, + {0x73, 0x55, 0x19}, + {0x5F, 0x2D, 0x14}, + }; + // clang-format on + + // clang-format off + static rgb8_t env_table2[mCO_PAGE_NUM] = { + {0xC3, 0xB9, 0x64}, + {0xC3, 0x9B, 0x5A}, + {0xB9, 0x87, 0x46}, + {0xA5, 0x73, 0x32}, + {0x91, 0x5F, 0x1E}, + {0x7D, 0x55, 0x0A}, + {0x69, 0x4B, 0x14}, + {0x55, 0x2D, 0x0A}, + }; + // clang-format on + + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int i; + int idx; + GRAPH* graph = game->graph; + + OPEN_POLY_OPA_DISP(graph); + + for (i = mCO_PAGE_NUM - 1; i >= 0; i--) { + idx = cporiginal_ovl->page_order[i]; + + if (idx != folder) { + Matrix_push(); + Matrix_translate(0.0f, -((idx * 29) / 2), 0.0f, 1); + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, prim_table[idx].r, prim_table[idx].g, prim_table[idx].b, 255); + gDPSetEnvColor(POLY_OPA_DISP++, env_table2[idx].r, env_table2[idx].g, env_table2[idx].b, 255); + gSPDisplayList(POLY_OPA_DISP++, sav_win1_taguT_model); + + Matrix_pull(); + } + } + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, sav_win1_kage_model); + + CLOSE_POLY_OPA_DISP(graph); +} + +extern Gfx sav_sentaku_taguT_model[]; + +static void mCO_set_frame_tagT_dl(Submenu* submenu, GAME* game, int folder) { + // clang-format off + static rgb8_t prim_table[mCO_PAGE_NUM] = { + {0x91, 0x87, 0x5F}, + {0x8C, 0x6E, 0x4B}, + {0x7D, 0x69, 0x4B}, + {0x7D, 0x5F, 0x4B}, + {0x73, 0x5F, 0x41}, + {0x73, 0x55, 0x2D}, + {0x5F, 0x4B, 0x37}, + {0x5F, 0x41, 0x28}, + }; + // clang-format on + + GRAPH* graph = game->graph; + int ofs_y; + + OPEN_POLY_OPA_DISP(graph); + + Matrix_push(); + + // something is wrong with this function call, likely the calculation for y + ofs_y = ((folder * 29) / 2); + ofs_y = 52 - ofs_y; + Matrix_translate(105.0f, ofs_y, 0.0f, 1); + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, prim_table[folder].r, prim_table[folder].g, prim_table[folder].b, 255); + gDPSetEnvColor(POLY_OPA_DISP++, env_table[folder].r, env_table[folder].g, env_table[folder].b, 255); + gSPDisplayList(POLY_OPA_DISP++, sav_sentaku_taguT_model); + + Matrix_pull(); + + CLOSE_POLY_OPA_DISP(graph); +} + +extern Gfx sav_win1_ueT_model[]; +extern Gfx sav_win1_nameT_model2[]; + +static void mCO_set_frame_ueT_dl(Submenu* submenu, GAME* game, int folder) { + GRAPH* graph = game->graph; + + OPEN_POLY_OPA_DISP(graph); + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + { + // clang-format off + static rgb8_t prim_table[mCO_PAGE_NUM] = { + {0xA5, 0x87, 0x5A}, + {0x9B, 0x7D, 0x50}, + {0x91, 0x73, 0x46}, + {0x87, 0x69, 0x3C}, + {0x82, 0x64, 0x37}, + {0x78, 0x5A, 0x2D}, + {0x73, 0x55, 0x28}, + {0x6E, 0x50, 0x23}, + }; + // clang-format on + + // clang-format off + static rgb8_t env2_table[mCO_PAGE_NUM] = { + {0xEB, 0xD7, 0xAF}, + {0xE1, 0xCD, 0xA5}, + {0xD7, 0xC3, 0x9B}, + {0xCD, 0xB9, 0x91}, + {0xC3, 0xAF, 0x87}, + {0xB9, 0xA5, 0x7D}, + {0xAF, 0x9B, 0x73}, + {0xA5, 0x91, 0x69}, + }; + // clang-format on + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, prim_table[folder].r, prim_table[folder].g, prim_table[folder].b, 255); + gDPSetEnvColor(POLY_OPA_DISP++, env2_table[folder].r, env2_table[folder].g, env2_table[folder].b, 255); + gSPDisplayList(POLY_OPA_DISP++, sav_win1_ueT_model); + } + + { + // clang-format off + static rgb8_t prim_table[mCO_PAGE_NUM] = { + {0x69, 0x50, 0x46}, + {0x3C, 0x32, 0x23}, + {0x4B, 0x37, 0x2D}, + {0x4B, 0x37, 0x2D}, + {0x41, 0x2D, 0x0F}, + {0x41, 0x37, 0x19}, + {0x41, 0x2D, 0x1E}, + {0x41, 0x37, 0x32}, + }; + // clang-format on + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, prim_table[folder].r, prim_table[folder].g, prim_table[folder].b, 255); + gDPSetEnvColor(POLY_OPA_DISP++, env_table[folder].r, env_table[folder].g, env_table[folder].b, 255); + gSPDisplayList(POLY_OPA_DISP++, sav_win1_nameT_model2); + } + + CLOSE_POLY_OPA_DISP(graph); +} + +extern u16 sav_win1_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win2_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win3_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win4_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win5_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win6_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win7_nuno_tex_rgb_ci4_pal[]; +extern u16 sav_win8_nuno_tex_rgb_ci4_pal[]; + +extern Gfx save_win1_w_before_model[]; +extern Gfx save_win1_w_all_model[]; +extern Gfx sav_win1_waku_model[]; +extern Gfx sav_mb_model[]; +extern Gfx sav_win1_f_model[]; + +static void mCO_set_frame_main_dl(Submenu* submenu, GAME* game, int folder) { + // clang-format off + static u16* pallet_table[mCO_PAGE_NUM] = { + sav_win1_nuno_tex_rgb_ci4_pal, + sav_win2_nuno_tex_rgb_ci4_pal, + sav_win3_nuno_tex_rgb_ci4_pal, + sav_win4_nuno_tex_rgb_ci4_pal, + sav_win5_nuno_tex_rgb_ci4_pal, + sav_win6_nuno_tex_rgb_ci4_pal, + sav_win7_nuno_tex_rgb_ci4_pal, + sav_win8_nuno_tex_rgb_ci4_pal, + }; + // clang-format on + + f32 pos_x = submenu->overlay->menu_control.texture_pos[0]; + f32 pos_y = submenu->overlay->menu_control.texture_pos[1]; + int tex_x; + int tex_y; + GRAPH* graph = game->graph; + int idx; + int j; + int k; + + tex_x = (u16)(-pos_x * 4.0f); + tex_y = (u16)(-pos_y * 4.0f); + + OPEN_POLY_OPA_DISP(graph); + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPLoadTLUT_Dolphin(POLY_OPA_DISP++, 14, 16, 1, pallet_table[folder]); + gSPDisplayList(POLY_OPA_DISP++, save_win1_w_before_model); + gDPSetTileSize_Dolphin(POLY_OPA_DISP++, G_TX_RENDERTILE, tex_x, tex_y, 32, 32); + gSPDisplayList(POLY_OPA_DISP++, save_win1_w_all_model); + gSPDisplayList(POLY_OPA_DISP++, sav_win1_waku_model); + + idx = 0; + for (k = 0; k < 4; k++) { + for (j = 0; j < 3; j++, idx++) { + Matrix_push(); + Matrix_translate(32 * j, 29 * -k, 0.0f, 1); + + if (mCO_check_hide_flg(submenu, folder, idx) == FALSE) { + 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, mCO_get_texture(submenu, folder, idx)); + gSPSegment(POLY_OPA_DISP++, ANIME_2_TXT_SEG, mNW_PaletteIdx2Palette(mCO_get_pallet_no(submenu, folder, idx))); + gSPDisplayList(POLY_OPA_DISP++, sav_mb_model); + } + + Matrix_pull(); + } + } + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, sav_win1_f_model); + + CLOSE_POLY_OPA_DISP(graph); + + mNW_draw_sav_mark_before(game); + + idx = 0; + for (k = 0; k < 4; k++) { + for (j = 0; j < 3; j++) { + if (mCO_check_mark_flg(submenu, idx)) { + Matrix_push(); + + mNW_draw_sav_mark(game, 32 * j, 44 + -k * 29); + Matrix_pull(); + } + + idx++; + } + } + +} + +static void mCO_set_frame_string_dl(Submenu* submenu, GAME* game, f32 pos_x, f32 pos_y, int folder) { + static rgb8_t color1 = { 0x50, 0x32, 0x32 }; + static rgb8_t color2 = { 0x46, 0x32, 0x32 }; + static rgb8_t color3 = { 0x3C, 0x28, 0x28 }; + static rgb8_t color4 = { 0x32, 0x1E, 0x1E }; + + // clang-format off + static rgb8_t* color_table[mCO_PAGE_NUM] = { + &color1, + &color1, + &color1, + &color2, + &color2, + &color3, + &color3, + &color4, + }; + // clang-format on + + GRAPH* graph = game->graph; + u8* folder_name = mCO_get_folder_name(submenu, folder); + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPORIGINAL]; + rgb8_t* color = color_table[folder]; + int len; + + if (menu_info->proc_status == mSM_OVL_PROC_WAIT && menu_info->next_menu_type == mSM_OVL_EDITOR) { + OPEN_POLY_OPA_DISP(graph); + + gDPSetCycleType(POLY_OPA_DISP++, G_CYC_1CYCLE); + gDPSetRenderMode(POLY_OPA_DISP++, G_RM_XLU_SURF, G_RM_XLU_SURF2); + + CLOSE_POLY_OPA_DISP(graph); + } + + submenu->overlay->set_char_matrix_proc(graph); + + 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 = mCO_FOLDER_NAME_LEN; + if (editor_ovl != NULL) { + pos_x = (pos_x + 194.0f) - (editor_ovl->line_width * 0.875f) * 0.5f; + } + } else { + len = mMl_strlen(folder_name, mCO_FOLDER_NAME_LEN, CHAR_SPACE); + pos_x = (pos_x + 194.0f) - (mFont_GetStringWidth(folder_name, len, TRUE) * 0.875f) * 0.5f; + } + + pos_y = 39.0f - pos_y; + if (len != 0) { + // clang-format off + mFont_SetLineStrings( + game, + folder_name, len, + pos_x, pos_y, + color->r, color->g, color->b, 255, + FALSE, TRUE, + 0.875f, 0.875f, + 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, pos_x + (editor_ovl->_26 + -6.0f) * 0.875f, pos_y); + } + } +} + +static void mCO_set_frame_change_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info, int folder) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + + Matrix_push(); + Matrix_translate(menu_info->position[0], -menu_info->position[1], 140.0f, 1); + + mCO_set_frame_main_dl(submenu, game, folder); + mCO_set_frame_tagS_dl(submenu, game, cporiginal_ovl->up_folder); + mCO_set_frame_ueT_dl(submenu, game, folder); + mCO_set_frame_string_dl(submenu, game, 0.0f, -menu_info->position[1], folder); + + Matrix_pull(); +} + +static void mCO_set_frame_dl(Submenu* submenu, GAME* game, mSM_MenuInfo_c* menu_info) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int folder; + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + + if (cporiginal_ovl->timer != 0) { + if (cporiginal_ovl->page_order[0] == cporiginal_ovl->up_folder) { + mCO_set_frame_change_dl(submenu, game, menu_info, cporiginal_ovl->page_order[1]); + } + + folder = cporiginal_ovl->up_folder; + + Matrix_push(); + Matrix_translate(menu_info->position[0], menu_info->position[1], 140.0f, 1); + mCO_set_frame_main_dl(submenu, game, folder); + mCO_set_frame_ueT_dl(submenu, game, folder); + mCO_set_frame_tagT_dl(submenu, game, folder); + mCO_set_frame_string_dl(submenu, game, 0.0f, menu_info->position[1] , folder); + Matrix_pull(); + + if (cporiginal_ovl->page_order[0] != cporiginal_ovl->up_folder) { + mCO_set_frame_change_dl(submenu, game, menu_info, cporiginal_ovl->page_order[0]); + } + } else { + folder = cporiginal_ovl->page_order[0]; + + Matrix_translate(menu_info->position[0], menu_info->position[1], 140.0f, 1); + mCO_set_frame_main_dl(submenu, game, folder); + mCO_set_frame_tagS_dl(submenu, game, folder); + mCO_set_frame_ueT_dl(submenu, game, folder); + mCO_set_frame_tagT_dl(submenu, game, folder); + mCO_set_frame_string_dl(submenu, game, menu_info->position[0], 0.0f, folder); + } +} + +static void mCO_cporiginal_ovl_draw(Submenu* submenu, GAME* game) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPORIGINAL]; + + menu_info->pre_draw_func(submenu, game); + mCO_set_frame_dl(submenu, game, menu_info); + if (submenu->overlay->cporiginal_ovl->timer == 0) { + submenu->overlay->menu_control.tag_draw_func(submenu, game, mSM_OVL_CPORIGINAL); + } +} + +extern void mCO_cporiginal_ovl_set_proc(Submenu* submenu) { + Submenu_Overlay_c* ovl = submenu->overlay; + mSM_MenuInfo_c* menu_info = &ovl->menu_info[mSM_OVL_CPORIGINAL]; + + ovl->menu_control.menu_move_func = mCO_cporiginal_ovl_move; + ovl->menu_control.menu_draw_func = mCO_cporiginal_ovl_draw; + + if (ovl->hand_ovl != NULL && menu_info->next_proc_status != mSM_OVL_PROC_END) { + submenu->overlay->hand_ovl->set_hand_func(submenu); + } +} + +static void mCO_cporiginal_ovl_init(Submenu* submenu) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_CPORIGINAL]; + int i; + u8* page_order_p = cporiginal_ovl->page_order; + + submenu->overlay->menu_control.animation_flag = FALSE; + menu_info->proc_status = mSM_OVL_PROC_MOVE; + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + menu_info->move_drt = mSM_MOVE_IN_RIGHT; + + for (i = 0; i < mCO_PAGE_NUM; i++, page_order_p++) { + *page_order_p = i; + } + + cporiginal_ovl->timer = 0; + cporiginal_ovl->change_flg = FALSE; + cporiginal_ovl->cloth_org_no = 255; + cporiginal_ovl->up_folder = 0; + + if (Now_Private->cloth.idx >= (CLOTH_NUM + 1)) { + int cloth_idx = Now_Private->cloth.idx - (CLOTH_NUM + 1); + + cporiginal_ovl->cloth_org_no = cloth_idx; + for (i = 0; i < mCO_PAGE_NUM; i++) { + if (cloth_idx == Now_Private->my_org_no_table[i]) { + cporiginal_ovl->cloth_org_idx = i; + } + } + } + + mCD_save_data_aram_to_main(cporiginal_ovl->card_original, mCD_KEEP_ORIGINAL_SIZE, mCD_ARAM_DATA_ORIGINAL); + for (i = 0; i < ARRAY_COUNT(cporiginal_ovl->image_order); i++) { + cporiginal_ovl->image_order[i] = i; + } +} + +extern void mCO_cporiginal_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* ovl = submenu->overlay; + + if (ovl->cporiginal_ovl == NULL) { + mem_clear((u8*)&co_ovl_data, sizeof(co_ovl_data), 0); + ovl->cporiginal_ovl = &co_ovl_data; + co_ovl_data.card_original = (mCD_keep_original_c*)zelda_malloc_align(mCD_KEEP_ORIGINAL_SIZE, 32); + mCO_clear_mark_flg(submenu); + } + + mCO_cporiginal_ovl_init(submenu); + mCO_cporiginal_ovl_set_proc(submenu); +} + +extern void mCO_cporiginal_ovl_destruct(Submenu* submenu) { + if (co_ovl_data.card_original != NULL) { + zelda_free(co_ovl_data.card_original); + co_ovl_data.card_original = NULL; + } + + submenu->overlay->cporiginal_ovl = NULL; +}