diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 30d97da0..43837485 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -609,6 +609,15 @@ bg_item.c: .rodata: [0x80646178, 0x80646218] .data: [0x80692BE0, 0x80695B38] .bss: [0x812FD938, 0x812FDDC8] +bg_police_item.c: + .text: [0x804BE338, 0x804BE890] + .rodata: [0x80646218, 0x80646220] + .data: [0x80695B38, 0x80695D60] + .bss: [0x812FDDC8, 0x812FDDE8] +bg_post_item.c: + .text: [0x804BE890, 0x804BE9FC] + .rodata: [0x80646220, 0x80646228] + .data: [0x80695D60, 0x80695D98] bg_winter_item.c: .text: [0x804BE9FC, 0x804C5E30] .rodata: [0x80646228, 0x806462C8] diff --git a/include/m_name_table.h b/include/m_name_table.h index 61f90eb4..dde35fab 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -2730,6 +2730,39 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define DUMMY_FLAG 0xF122 #define DUMMY_TENT 0xF127 #define DUMMY_BOAT 0xF128 +#define RSV_POLICE_ITEM_0 0xF128 // why is this duplicated? +#define RSV_POLICE_ITEM_1 0xF129 +#define RSV_POLICE_ITEM_2 0xF12A +#define RSV_POLICE_ITEM_3 0xF12B +#define RSV_POLICE_ITEM_4 0xF12C +#define RSV_POLICE_ITEM_5 0xF12D +#define RSV_POLICE_ITEM_6 0xF12E +#define RSV_POLICE_ITEM_7 0xF12F +#define RSV_POLICE_ITEM_8 0xF130 +#define RSV_POLICE_ITEM_9 0xF131 +#define RSV_POLICE_ITEM_10 0xF132 +#define RSV_POLICE_ITEM_11 0xF133 +#define RSV_POLICE_ITEM_12 0xF134 +#define RSV_POLICE_ITEM_13 0xF135 +#define RSV_POLICE_ITEM_14 0xF136 +#define RSV_POLICE_ITEM_15 0xF137 +#define RSV_POLICE_ITEM_16 0xF138 +#define RSV_POLICE_ITEM_17 0xF139 +#define RSV_POLICE_ITEM_18 0xF13A +#define RSV_POLICE_ITEM_19 0xF13B +#define RSV_POLICE_ITEM_20 0xF13C +#define RSV_POLICE_ITEM_21 0xF13D +#define RSV_POLICE_ITEM_22 0xF13E +#define RSV_POLICE_ITEM_23 0xF13F +#define RSV_POLICE_ITEM_24 0xF140 +#define RSV_POLICE_ITEM_25 0xF141 +#define RSV_POLICE_ITEM_26 0xF142 +#define RSV_POLICE_ITEM_27 0xF143 +#define RSV_POLICE_ITEM_28 0xF144 +#define RSV_POLICE_ITEM_29 0xF145 +#define RSV_POLICE_ITEM_30 0xF146 +#define RSV_POLICE_ITEM_31 0xF147 +#define RSV_POLICE_ITEM_END 0xF148 #define RSV_DOOR 0xFE1B #define RSV_FE1C 0xFE1C diff --git a/src/bg_police_item.c b/src/bg_police_item.c new file mode 100644 index 00000000..fab3c314 --- /dev/null +++ b/src/bg_police_item.c @@ -0,0 +1,50 @@ +#include "bg_police_item.h" + +#include "m_name_table.h" +#include "m_rcp.h" +#include "sys_matrix.h" +#include "m_player_lib.h" +#include "m_common_data.h" + +typedef struct bg_police_item_draw_pos { + int next; + MtxF mtx; +} bPI_draw_pos_c; + +typedef struct bg_police_item_draw_data { + u16 start_idx[mNT_ITEM_TYPE_NUM - 1]; + bPI_draw_pos_c draw_pos[UT_TOTAL_NUM + 1]; +} bPI_draw_data_c; + +typedef struct bg_police_item_draw_tbl { + int draw_flag; + bPI_draw_data_c draw_data; +} bPI_draw_tbl_c; + +typedef struct bg_police_item_s { + ACTOR actor_class; + bPI_draw_tbl_c draw_tbl; + mFI_item_table_c item_tbl; +} BG_POLICE_ITEM_ACTOR; + +static void bPI_actor_move(ACTOR* actorx, GAME* game); +static void bPI_actor_draw(ACTOR* actorx, GAME* game); + +ACTOR_PROFILE BgPoliceItem_Profile = { + mAc_PROFILE_BGPOLICEITEM, + ACTOR_PART_ITEM, + ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_KEEP, + sizeof(BG_POLICE_ITEM_ACTOR), + mActor_NONE_PROC1, + mActor_NONE_PROC1, + &bPI_actor_move, + &bPI_actor_draw, + NULL, +}; + +#include "../src/bg_police_item_data.c_inc" + +#include "../src/bg_police_item_move.c_inc" +#include "../src/bg_police_item_draw.c_inc" diff --git a/src/bg_police_item_data.c_inc b/src/bg_police_item_data.c_inc new file mode 100644 index 00000000..9fa0b12f --- /dev/null +++ b/src/bg_police_item_data.c_inc @@ -0,0 +1,217 @@ +extern Gfx apple_DL_mode[]; +extern Gfx orange_DL_mode[]; +extern Gfx peach_DL_mode[]; +extern Gfx pear_DL_mode[]; +extern Gfx nuts_DL_mode[]; +extern Gfx matutake_DL_mode[]; +extern Gfx kabu_DL_mode[]; +extern Gfx fish_DL_mode[]; +extern Gfx bag_DL_mode[]; +extern Gfx leaf_DL_mode[]; +extern Gfx obj_rollT_mat_model[]; +extern Gfx box_DL_mode[]; +extern Gfx pack_DL_mode[]; +extern Gfx present_DL_mode[]; +extern Gfx seed_DL_mode[]; +extern Gfx obj_haniwaT_mat_model[]; +extern Gfx obj_boxT_mat_model[]; +extern Gfx obj_cageT_mat_model[]; +extern Gfx obj_toolT_mat_model[]; +extern Gfx obj_fossilT_mat_model[]; +extern Gfx obj_trashT_mat_model[]; +extern Gfx obj_letterT_mat_model[]; +extern Gfx obj_otosiT_mat_model[]; +extern Gfx obj_item_shellAT_mat_model[]; +extern Gfx obj_item_shellBT_mat_model[]; +extern Gfx obj_item_shellCT_mat_model[]; +extern Gfx obj_shop_candy_mat_modelT[]; +extern Gfx obj_item_cocoT_mat_model[]; +extern Gfx obj_item_omikuji_mat_model[]; +extern Gfx obj_item_clothT_mat_model[]; +extern Gfx obj_item_carpetT_mat_model[]; +extern Gfx obj_item_wallT_mat_model[]; +extern Gfx obj_item_axeT_mat_model[]; +extern Gfx obj_item_netT_mat_model[]; +extern Gfx obj_item_rodT_mat_model[]; +extern Gfx obj_item_shovelT_mat_model[]; +extern Gfx obj_item_axe2T_mat_model[]; +extern Gfx obj_item_net2T_mat_model[]; +extern Gfx obj_item_rod2T_mat_model[]; +extern Gfx obj_item_shovel2T_mat_model[]; +extern Gfx obj_item_umbrellaT_mat_model[]; +extern Gfx obj_item_kazaT_mat_model[]; +extern Gfx obj_item_utiwaT_mat_model[]; +extern Gfx obj_item_paperT_mat_model[]; +extern Gfx obj_item_seedT_mat_model[]; +extern Gfx obj_item_fukuT_mat_model[]; +extern Gfx obj_item_taisouT_mat_model[]; +extern Gfx obj_mdT_mat_model[]; +extern Gfx obj_item_ticketT_mat_model[]; +extern Gfx obj_item_boneT_mat_model[]; +extern Gfx obj_item_diaryT_mat_model[]; +extern Gfx obj_item_fork_onT_mat_model[]; + +static Gfx* mode_DL_table[] = { + NULL, + apple_DL_mode, + orange_DL_mode, + peach_DL_mode, + pear_DL_mode, + nuts_DL_mode, + matutake_DL_mode, + kabu_DL_mode, + fish_DL_mode, + bag_DL_mode, + leaf_DL_mode, + obj_rollT_mat_model, + box_DL_mode, + pack_DL_mode, + present_DL_mode, + seed_DL_mode, + obj_haniwaT_mat_model, + obj_boxT_mat_model, + obj_cageT_mat_model, + obj_toolT_mat_model, + obj_fossilT_mat_model, + obj_trashT_mat_model, + obj_letterT_mat_model, + obj_otosiT_mat_model, + obj_item_shellAT_mat_model, + obj_item_shellBT_mat_model, + obj_item_shellCT_mat_model, + obj_shop_candy_mat_modelT, + obj_item_cocoT_mat_model, + obj_item_omikuji_mat_model, + obj_item_clothT_mat_model, + obj_item_carpetT_mat_model, + obj_item_wallT_mat_model, + obj_item_axeT_mat_model, + obj_item_netT_mat_model, + obj_item_rodT_mat_model, + obj_item_shovelT_mat_model, + obj_item_axe2T_mat_model, + obj_item_net2T_mat_model, + obj_item_rod2T_mat_model, + obj_item_shovel2T_mat_model, + obj_item_umbrellaT_mat_model, + obj_item_kazaT_mat_model, + obj_item_utiwaT_mat_model, + obj_item_paperT_mat_model, + obj_item_seedT_mat_model, + obj_item_fukuT_mat_model, + obj_item_taisouT_mat_model, + obj_mdT_mat_model, + obj_item_ticketT_mat_model, + obj_item_boneT_mat_model, + obj_item_diaryT_mat_model, + obj_item_fork_onT_mat_model, +}; + +extern Gfx apple_DL_vtx[]; +extern Gfx orange_DL_vtx[]; +extern Gfx peach_DL_vtx[]; +extern Gfx pear_DL_vtx[]; +extern Gfx nuts_DL_vtx[]; +extern Gfx matutake_DL_vtx[]; +extern Gfx kabu_DL_vtx[]; +extern Gfx fish_DL_vtx[]; +extern Gfx bag_DL_vtx[]; +extern Gfx leaf_DL_vtx[]; +extern Gfx obj_rollT_gfx_model[]; +extern Gfx box_DL_vtx[]; +extern Gfx pack_DL_vtx[]; +extern Gfx present_DL_vtx[]; +extern Gfx seed_DL_vtx[]; +extern Gfx obj_haniwaT_gfx_model[]; +extern Gfx obj_boxT_gfx_model[]; +extern Gfx obj_cageT_gfx_model[]; +extern Gfx obj_toolT_gfx_model[]; +extern Gfx obj_fossilT_gfx_model[]; +extern Gfx obj_trashT_gfx_model[]; +extern Gfx obj_letterT_gfx_model[]; +extern Gfx obj_otosiT_gfx_model[]; +extern Gfx obj_item_shellAT_gfx_model[]; +extern Gfx obj_item_shellBT_gfx_model[]; +extern Gfx obj_item_shellCT_gfx_model[]; +extern Gfx obj_shop_candy_gfx_modelT[]; +extern Gfx obj_item_cocoT_gfx_model[]; +extern Gfx obj_item_omikuji_gfx_model[]; +extern Gfx obj_item_clothT_gfx_model[]; +extern Gfx obj_item_carpetT_gfx_model[]; +extern Gfx obj_item_wallT_gfx_model[]; +extern Gfx obj_item_axeT_gfx_model[]; +extern Gfx obj_item_netT_gfx_model[]; +extern Gfx obj_item_rodT_gfx_model[]; +extern Gfx obj_item_shovelT_gfx_model[]; +extern Gfx obj_item_axe2T_gfx_model[]; +extern Gfx obj_item_net2T_gfx_model[]; +extern Gfx obj_item_rod2T_gfx_model[]; +extern Gfx obj_item_shovel2T_gfx_model[]; +extern Gfx obj_item_umbrellaT_gfx_model[]; +extern Gfx obj_item_kazaT_gfx_model[]; +extern Gfx obj_item_utiwaT_gfx_model[]; +extern Gfx obj_item_paperT_gfx_model[]; +extern Gfx obj_item_seedT_gfx_model[]; +extern Gfx obj_item_fukuT_gfx_model[]; +extern Gfx obj_item_taisouT_gfx_model[]; +extern Gfx obj_mdT_gfx_model[]; +extern Gfx obj_item_ticketT_gfx_model[]; +extern Gfx obj_item_boneT_gfx_model[]; +extern Gfx obj_item_diaryT_gfx_model[]; +extern Gfx obj_item_fork_onT_gfx_model[]; + +static Gfx* vtx_DL_table[] = { + NULL, + apple_DL_vtx, + orange_DL_vtx, + peach_DL_vtx, + pear_DL_vtx, + nuts_DL_vtx, + matutake_DL_vtx, + kabu_DL_vtx, + fish_DL_vtx, + bag_DL_vtx, + leaf_DL_vtx, + obj_rollT_gfx_model, + box_DL_vtx, + pack_DL_vtx, + present_DL_vtx, + seed_DL_vtx, + obj_haniwaT_gfx_model, + obj_boxT_gfx_model, + obj_cageT_gfx_model, + obj_toolT_gfx_model, + obj_fossilT_gfx_model, + obj_trashT_gfx_model, + obj_letterT_gfx_model, + obj_otosiT_gfx_model, + obj_item_shellAT_gfx_model, + obj_item_shellBT_gfx_model, + obj_item_shellCT_gfx_model, + obj_shop_candy_gfx_modelT, + obj_item_cocoT_gfx_model, + obj_item_omikuji_gfx_model, + obj_item_clothT_gfx_model, + obj_item_carpetT_gfx_model, + obj_item_wallT_gfx_model, + obj_item_axeT_gfx_model, + obj_item_netT_gfx_model, + obj_item_rodT_gfx_model, + obj_item_shovelT_gfx_model, + obj_item_axe2T_gfx_model, + obj_item_net2T_gfx_model, + obj_item_rod2T_gfx_model, + obj_item_shovel2T_gfx_model, + obj_item_umbrellaT_gfx_model, + obj_item_kazaT_gfx_model, + obj_item_utiwaT_gfx_model, + obj_item_paperT_gfx_model, + obj_item_seedT_gfx_model, + obj_item_fukuT_gfx_model, + obj_item_taisouT_gfx_model, + obj_mdT_gfx_model, + obj_item_ticketT_gfx_model, + obj_item_boneT_gfx_model, + obj_item_diaryT_gfx_model, + obj_item_fork_onT_gfx_model, +}; diff --git a/src/bg_police_item_draw.c_inc b/src/bg_police_item_draw.c_inc new file mode 100644 index 00000000..69b21abd --- /dev/null +++ b/src/bg_police_item_draw.c_inc @@ -0,0 +1,66 @@ +typedef struct draw_work_s { + GAME* game; + GRAPH* graph; + bPI_draw_tbl_c* draw_tbl; + int start_idx; + Gfx* mode_p; // material (textures, etc) + Gfx* vtx_p; // tris + int _18; +} bIP_draw_work_c; + +static bIP_draw_work_c draw_work; + +static void bPI_draw_item_loop(void) { + bPI_draw_pos_c* draw_pos = draw_work.draw_tbl->draw_data.draw_pos + draw_work.start_idx; + Gfx* vtx = draw_work.vtx_p; + GRAPH* graph = draw_work.graph; + Gfx* gfx; + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + /* Load the texture data first */ + gSPDisplayList(gfx++, draw_work.mode_p); + + for (draw_pos; draw_pos->next != 256; draw_pos += draw_pos->next) { + Matrix_put(&draw_pos->mtx); + + gDPPipeSync(gfx++); + gSPMatrix(gfx++, _Matrix_to_Mtx_new(draw_work.graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + /* Draw all instances of this item using the loaded texture data */ + gSPDisplayList(gfx++, vtx); + } + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); +} + +static void bPI_draw_item(void) { + u16* start_idx = draw_work.draw_tbl->draw_data.start_idx; + int i; + + _texture_z_light_fog_prim(draw_work.graph); + + /* We start at 1 so we skip mNT_ITEM_TYPE_NONE, start_idx already takes this into account */ + for (i = 1; i < mNT_ITEM_TYPE_NUM; i++, start_idx++) { + /* If there's at least one entry of the item, draw all of the same type */ + if (*start_idx != 0) { + draw_work.start_idx = *start_idx; + draw_work.mode_p = mode_DL_table[i]; + draw_work.vtx_p = vtx_DL_table[i]; + bPI_draw_item_loop(); + } + } +} + +static void bPI_actor_draw(ACTOR* actorx, GAME* game) { + BG_POLICE_ITEM_ACTOR* bg_police_item = (BG_POLICE_ITEM_ACTOR*)actorx; + + draw_work.game = game; + draw_work.graph = game->graph; + + if (bg_police_item->draw_tbl.draw_flag == TRUE) { + draw_work.draw_tbl = &bg_police_item->draw_tbl; + bPI_draw_item(); + } +} diff --git a/src/bg_police_item_move.c_inc b/src/bg_police_item_move.c_inc new file mode 100644 index 00000000..6492dace --- /dev/null +++ b/src/bg_police_item_move.c_inc @@ -0,0 +1,107 @@ +static void bPI_outPutData(u16* draw_start, bPI_draw_pos_c** draw_pos_pp, u16* data_count, int type, + mFI_block_tbl_c* block_tbl, int idx) { + if (type != mNT_ITEM_TYPE_NUM) { + static f32 pos_table[] = { + 20.0f, 60.0f, 100.0f, 140.0f, 180.0f, 220.0f, 260.0f, 300.0f, + 340.0f, 380.0f, 420.0f, 460.0f, 500.0f, 540.0f, 580.0f, 620.0f, + }; + + xyz_t pos; + + pos.x = block_tbl->pos_x + pos_table[idx & 15]; + pos.z = block_tbl->pos_z + pos_table[(idx >> 4) & 15]; + pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 1.0f); + + Matrix_translate(pos.x, pos.y, pos.z, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + Matrix_get(&(*draw_pos_pp)->mtx); + (*draw_pos_pp)->next = draw_start[type] - *data_count; + draw_start[type] = *data_count; + (*draw_pos_pp)++; + (*data_count)++; + } +} + +static void bPI_classifyitemDataTable(bPI_draw_tbl_c* draw_tbl, mFI_block_tbl_c* block_tbl, u16* draw_start) { + bPI_draw_pos_c* draw_pos = draw_tbl->draw_data.draw_pos + 1; + mActor_name_t* fg_p = block_tbl->items; + mActor_name_t item; + u16 data_count = 1; + int i; + + Matrix_push(); + + for (i = 0; i < UT_TOTAL_NUM; i++, fg_p++) { + if (*fg_p >= RSV_POLICE_ITEM_0 && *fg_p < RSV_POLICE_ITEM_END) { + item = Save_Get(police_box).keep_items[*fg_p - RSV_POLICE_ITEM_0]; + + if (item != EMPTY_NO) { + bPI_outPutData(draw_start, &draw_pos, &data_count, mNT_get_itemTableNo(item) - 1, block_tbl, i); + } + } + } + + Matrix_pull(); +} + +static void bPI_set_draw_tbl(BG_POLICE_ITEM_ACTOR* bg_police_item, bPI_draw_tbl_c* draw_tbl, + mFI_block_tbl_c* block_tbl) { + bPI_draw_pos_c* draw_pos = draw_tbl->draw_data.draw_pos; + u16 draw_start[mNT_ITEM_TYPE_NUM - 1]; + int i; + + for (i = 0; i < ARRAY_COUNT(draw_start); i++) { + draw_start[i] = 0; + } + + for (i = 0; i < (UT_TOTAL_NUM + 1); i++, draw_pos++) { + draw_pos->next = 256; + } + + bPI_classifyitemDataTable(draw_tbl, block_tbl, draw_start); + + { + u16* start_idx_p = draw_tbl->draw_data.start_idx; + u16* draw_start_p = draw_start; + + for (i = 0; i < ARRAY_COUNT(draw_start); i++) { + *start_idx_p++ = *draw_start_p++; + } + } + + bg_police_item->draw_tbl.draw_flag = TRUE; +} + +static void bPI_chg_draw_tbl(BG_POLICE_ITEM_ACTOR* bg_police_item) { + int i; + int j; + + /* Why did they leave it in a loop lol... */ + for (i = 0; i < mFM_VISIBLE_BLOCK_NUM; i++) { + bg_police_item->draw_tbl.draw_flag = FALSE; + } + + for (i = bg_police_item->item_tbl.count, j = 0; i != 0; i--) { + bPI_set_draw_tbl(bg_police_item, &bg_police_item->draw_tbl, &bg_police_item->item_tbl.block_info_tbl[j]); + j++; + } +} + +static void bPI_renew_draw_and_crs_data(BG_POLICE_ITEM_ACTOR* bg_police_item, GAME_PLAY* play) { + PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play); + + if (player != NULL) { + mFI_GetItemTable(&bg_police_item->item_tbl, player->actor_class.world.position, __FILE__, 182); + } + + bPI_chg_draw_tbl(bg_police_item); +} + +static void bPI_actor_move(ACTOR* actorx, GAME* game) { + BG_POLICE_ITEM_ACTOR* bg_police_item = (BG_POLICE_ITEM_ACTOR*)actorx; + GAME_PLAY* play = (GAME_PLAY*)game; + + if (mFI_FGisUpDate() == TRUE || mFI_ItemisBorn() == TRUE) { + bPI_renew_draw_and_crs_data(bg_police_item, play); + } +} diff --git a/src/bg_post_item.c b/src/bg_post_item.c new file mode 100644 index 00000000..15a9c0d8 --- /dev/null +++ b/src/bg_post_item.c @@ -0,0 +1,85 @@ +#include "bg_post_item.h" + +#include "m_name_table.h" +#include "m_post_office.h" +#include "m_rcp.h" +#include "sys_matrix.h" +#include "m_common_data.h" + +typedef struct bg_post_item_s { + ACTOR actor_class; + u8 keep_mail_sum; + u8 update_mail_flag; +} BG_POST_ITEM_ACTOR; + +static void bPTI_actor_ct(ACTOR* actorx, GAME* game); +static void bPTI_actor_draw(ACTOR* actorx, GAME* game); + +ACTOR_PROFILE BgPostItem_Profile = { + mAc_PROFILE_BGPOSTITEM, + ACTOR_PART_ITEM, + ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED, + EMPTY_NO, + ACTOR_OBJ_BANK_KEEP, + sizeof(BG_POST_ITEM_ACTOR), + &bPTI_actor_ct, + mActor_NONE_PROC1, + mActor_NONE_PROC1, + &bPTI_actor_draw, + NULL, +}; + +static void bPTI_actor_ct(ACTOR* actorx, GAME* game) { + BG_POST_ITEM_ACTOR* bg_post_item = (BG_POST_ITEM_ACTOR*)actorx; + int post_girl_type; + + if (Common_Get(time.now_sec) >= (19 * mTM_SECONDS_IN_HOUR) || + Common_Get(time.now_sec) < (7 * mTM_SECONDS_IN_HOUR)) { + post_girl_type = 1; + } else { + post_girl_type = 0; + } + + Common_Set(post_girl_npc_type, post_girl_type); + bg_post_item->update_mail_flag = TRUE; +} + +extern Gfx obj_letterT_mat_model[]; +extern Gfx obj_letterT_gfx_model[]; + +static void bPTI_actor_draw(ACTOR* actorx, GAME* game) { + static float setX[mPO_MAIL_STORAGE_SIZE] = { 80.0f, 120.0f, 160.0f, 200.0f, 240.0f }; + BG_POST_ITEM_ACTOR* bg_post_item = (BG_POST_ITEM_ACTOR*)actorx; + int keep_mail_sum; + + if (bg_post_item->update_mail_flag == TRUE) { + bg_post_item->keep_mail_sum = mPO_get_keep_mail_sum(); + bg_post_item->update_mail_flag = FALSE; + } + + keep_mail_sum = bg_post_item->keep_mail_sum; + if (keep_mail_sum > 0) { + GRAPH* graph = game->graph; + f32* setX_p = setX; + Gfx* gfx; + + _texture_z_light_fog_prim(graph); + + OPEN_DISP(graph); + gfx = NOW_POLY_OPA_DISP; + + gSPDisplayList(gfx++, obj_letterT_mat_model); + for (keep_mail_sum; keep_mail_sum != 0; keep_mail_sum--) { + Matrix_translate(*setX_p, 60.0f, 60.0f, 0); + Matrix_scale(0.01f, 0.01f, 0.01f, 1); + + gDPPipeSync(gfx++); + gSPMatrix(gfx++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(gfx++, obj_letterT_gfx_model); + setX_p++; + } + + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(graph); + } +}