From 1662d728a7587ba5df7bac678e828bb639715b95 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Fri, 17 May 2024 00:54:42 -0400 Subject: [PATCH 1/8] inventory ovl work --- include/m_inventory_ovl.h | 45 ++++- include/m_player.h | 315 +++++++++++++++++++++++++++++++++ src/m_inventory_ovl.c | 362 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 720 insertions(+), 2 deletions(-) create mode 100644 src/m_inventory_ovl.c diff --git a/include/m_inventory_ovl.h b/include/m_inventory_ovl.h index 8d316922..856a7c8c 100644 --- a/include/m_inventory_ovl.h +++ b/include/m_inventory_ovl.h @@ -13,6 +13,36 @@ extern "C" { #define mIV_PLAYER_JOINT_NUM 27 #define mIV_ITEM_JOINT_NUM 8 +#define mIV_PLAYER_EFFECT_NUM 20 + +enum { + mIV_ITEM_SCALE_TYPE_NONE, + mIV_ITEM_SCALE_TYPE_SHRINK, + mIV_ITEM_SCALE_TYPE_GROW, + mIV_ITEM_SCALE_TYPE_GROW_FAST, + mIV_ITEM_SCALE_TYPE_GROW_FASTEST, + mIV_ITEM_SCALE_TYPE_PRESENT, + + mIV_ITEM_SCALE_TYPE_NUM +}; + +enum { + mIV_PAGE_FISH_COLLECTION, + mIV_PAGE_INVENTORY, + mIV_PAGE_INSECT_COLLECTION, + mIV_PAGE_ORIGINAL_DESIGNS, + + mIV_PAGE_NUM +}; + +typedef struct inventory_effect_s { + int timer; + xyz_t pos; + f32 scale; + f32 speed; +} mIV_pl_eff_c; + +typedef mActor_name_t (*mIV_SET_COLLECT_ITEMNO_PROC)(int, int); /* sizeof (struct inventory_ovl_s) == 0x5EC */ struct inventory_ovl_s { @@ -42,8 +72,19 @@ struct inventory_ovl_s { u8 release_flag; u8 food_idx; - - u8 _3E3[0x5EC - 0x3E3]; + u8 item_scale_type[mPr_POCKETS_SLOT_COUNT]; + u8 page_order[mIV_PAGE_NUM]; + s16 page_move_timer; + s16 remove_timer; + mIV_pl_eff_c pl_eff[mIV_PLAYER_EFFECT_NUM]; + mIV_SET_COLLECT_ITEMNO_PROC set_collect_itemNo_proc; + u16 item_mark_bitfield; + u16 _5E2; + s16 _5E4; + u8 _5E6[2]; + u16 mail_mark_bitfield; + u8 original_flag; + u8 wc_flag; }; extern void mIV_inventory_ovl_construct(Submenu* submenu); diff --git a/include/m_player.h b/include/m_player.h index 21d4ee79..f492dbab 100644 --- a/include/m_player.h +++ b/include/m_player.h @@ -155,6 +155,321 @@ enum { mPlayer_INDEX_DEMO_GET_GOLDEN_AXE_WAIT }; +enum { + mPlayer_ANIM_WAIT1, + mPlayer_ANIM_WALK1, + mPlayer_ANIM_AXE1, + mPlayer_ANIM_RUN1, + mPlayer_ANIM_PUSH1, + mPlayer_ANIM_PULL1, + mPlayer_ANIM_HOLD_WAIT1, + mPlayer_ANIM_PICKUP1, + mPlayer_ANIM_LTURN1, + mPlayer_ANIM_RTURN1, + mPlayer_ANIM_GET1, + mPlayer_ANIM_GET_CHANGE1, + mPlayer_ANIM_GET_PUTAWAY1, + mPlayer_ANIM_OPEN1, + mPlayer_ANIM_PUTAWAY1, + mPlayer_ANIM_TRANS_WAIT1, + mPlayer_ANIM_TRANSFER1, + mPlayer_ANIM_UMB_OPEN1, + mPlayer_ANIM_UMBRELLA1, + mPlayer_ANIM_DASH1, + mPlayer_ANIM_RUN_SLIP1, + mPlayer_ANIM_GET_PULL1, + mPlayer_ANIM_GET_M1, + mPlayer_ANIM_KAMAE_MOVE_M1, + mPlayer_ANIM_KAMAE_WAIT_M1, + mPlayer_ANIM_KOKERU_A1, + mPlayer_ANIM_KOKERU_GETUP_A1, + mPlayer_ANIM_KOKERU_GETUP_N1, + mPlayer_ANIM_KOKERU_N1, + mPlayer_ANIM_NET1, + mPlayer_ANIM_NET_SWING1, + mPlayer_ANIM_AXE_SWING1, + mPlayer_ANIM_KAMAE_SLIP_M1, + mPlayer_ANIM_KOKERU1, + mPlayer_ANIM_KOKERU_GETUP1, + mPlayer_ANIM_SITDOWN1, + mPlayer_ANIM_SITDOWN_WAIT1, + mPlayer_ANIM_STANDUP1, + mPlayer_ANIM_PUTAWAY_M1, + mPlayer_ANIM_BED_WAIT1, + mPlayer_ANIM_INBED_L1, + mPlayer_ANIM_INBED_R1, + mPlayer_ANIM_INTRAIN1, + mPlayer_ANIM_KAGU_OPEN_D1, + mPlayer_ANIM_KAGU_OPEN_H1, + mPlayer_ANIM_KAGU_OPEN_K1, + mPlayer_ANIM_NEGAERI_L1, + mPlayer_ANIM_NEGAERI_R1, + mPlayer_ANIM_OUTBED_L1, + mPlayer_ANIM_OUTBED_R1, + mPlayer_ANIM_OUTTRAIN1, + mPlayer_ANIM_KAGU_CLOSE_D1, + mPlayer_ANIM_KAGU_CLOSE_H1, + mPlayer_ANIM_KAGU_CLOSE_K1, + mPlayer_ANIM_KAGU_WAIT_D1, + mPlayer_ANIM_KAGU_WAIT_H1, + mPlayer_ANIM_KAGU_WAIT_K1, + mPlayer_ANIM_GO_OUT_O1, + mPlayer_ANIM_GO_OUT_S1, + mPlayer_ANIM_INTO_S1, + mPlayer_ANIM_AXE_HANE1, + mPlayer_ANIM_AXE_SUKA1, + mPlayer_ANIM_HOLD_WAIT_H1, + mPlayer_ANIM_HOLD_WAIT_O1, + mPlayer_ANIM_GET_T1, + mPlayer_ANIM_GET_T2, + mPlayer_ANIM_PUTAWAY_T1, + mPlayer_ANIM_SAO1, + mPlayer_ANIM_SAO_SWING1, + mPlayer_ANIM_TURI_HIKI1, + mPlayer_ANIM_TURI_WAIT1, + mPlayer_ANIM_NOT_GET_T1, + mPlayer_ANIM_MENU_CATCH1, + mPlayer_ANIM_MENU_CHANGE1, + mPlayer_ANIM_UMB_CLOSE1, + mPlayer_ANIM_NOT_SAO_SWING1, + mPlayer_ANIM_INTRAIN_WAIT1, + mPlayer_ANIM_CLEAR_TABLE1, + mPlayer_ANIM_DIG1, + mPlayer_ANIM_FILL_UP1, + mPlayer_ANIM_NOT_DIG1, + mPlayer_ANIM_CLEAR_TABLE_L1, + mPlayer_ANIM_PICKUP_L1, + mPlayer_ANIM_SCOOP1, + mPlayer_ANIM_CONFIRM1, + mPlayer_ANIM_DIG_SUKA1, + mPlayer_ANIM_GET_D1, + mPlayer_ANIM_PUTAWAY_D1, + mPlayer_ANIM_DIG_KABU1, + mPlayer_ANIM_FILL_UP_I1, + mPlayer_ANIM_SEND_MAIL1, + mPlayer_ANIM_GET_F1, + mPlayer_ANIM_GET_PULL_F1, + mPlayer_ANIM_GET_PUTAWAY_F1, + mPlayer_ANIM_TRANS_WAIT_F1, + mPlayer_ANIM_TRANSFER_F1, + mPlayer_ANIM_SHAKE1, + mPlayer_ANIM_TIRED1, + mPlayer_ANIM_WASH1, + mPlayer_ANIM_WASH2, + mPlayer_ANIM_WASH3, + mPlayer_ANIM_WASH4, + mPlayer_ANIM_WASH5, + mPlayer_ANIM_FUKUBIKI1, + mPlayer_ANIM_OMAIRI1, + mPlayer_ANIM_SAISEN1, + mPlayer_ANIM_RETURN_MAIL1, + mPlayer_ANIM_RETURN_MAIL2, + mPlayer_ANIM_RETURN_MAIL3, + mPlayer_ANIM_EAT1, + mPlayer_ANIM_GAAAN1, + mPlayer_ANIM_GAAAN2, + mPlayer_ANIM_DERU1, + mPlayer_ANIM_GURATUKU1, + mPlayer_ANIM_MOGAKU1, + mPlayer_ANIM_OTIRU1, + mPlayer_ANIM_ZASSOU1, + mPlayer_ANIM_KNOCK1, + mPlayer_ANIM_BIKU1, + mPlayer_ANIM_HATI1, + mPlayer_ANIM_HATI2, + mPlayer_ANIM_HATI3, + mPlayer_ANIM_PUSH_YUKI1, + mPlayer_ANIM_DERU2, + mPlayer_ANIM_OTIRU2, + mPlayer_ANIM_ITAZURA1, + mPlayer_ANIM_UMB_ROT1, + mPlayer_ANIM_PICKUP_WAIT1, + mPlayer_ANIM_YATTA1, + mPlayer_ANIM_YATTA2, + mPlayer_ANIM_YATTA3, + mPlayer_ANIM_KAZA1, + mPlayer_ANIM_MOSQUITO1, + mPlayer_ANIM_MOSQUITO2, + mPlayer_ANIM_RIDE1, + mPlayer_ANIM_RIDE2, + mPlayer_ANIM_RIDEWAIT, + mPlayer_ANIM_GETOFF1, + mPlayer_ANIM_GETOFF2, + mPlayer_ANIM_UTIWA_WAIT1, + mPlayer_ANIM_UTIWA_D1, + mPlayer_ANIM_AXE_BREAK1, + mPlayer_ANIM_AXE_BREAKWAIT1, + mPlayer_ANIM_LIGHT_ON1, + mPlayer_ANIM_TAISOU1, + mPlayer_ANIM_TAISOU2_1, + mPlayer_ANIM_TAISOU2_2, + mPlayer_ANIM_TAISOU3, + mPlayer_ANIM_TAISOU4_1, + mPlayer_ANIM_TAISOU4_2, + mPlayer_ANIM_TAISOU5_1, + mPlayer_ANIM_TAISOU5_2, + mPlayer_ANIM_TAISOU6_1, + mPlayer_ANIM_TAISOU6_2, + mPlayer_ANIM_TAISOU7_1, + mPlayer_ANIM_TAISOU7_2, + mPlayer_ANIM_OMAIRI_US1, + + mPlayer_ANIM_NUM +}; + +enum { + mPlayer_ITEM_KIND_AXE, + mPlayer_ITEM_KIND_AXE_USE_1, + mPlayer_ITEM_KIND_AXE_USE_2, + mPlayer_ITEM_KIND_AXE_USE_3, + mPlayer_ITEM_KIND_AXE_USE_4, + mPlayer_ITEM_KIND_AXE_USE_5, + mPlayer_ITEM_KIND_AXE_USE_6, + mPlayer_ITEM_KIND_AXE_USE_7, + mPlayer_ITEM_KIND_GOLD_AXE, + + mPlayer_ITEM_KIND_NET, + mPlayer_ITEM_KIND_GOLD_NET, + + mPlayer_ITEM_KIND_UMBRELLA00, + mPlayer_ITEM_KIND_UMBRELLA01, + mPlayer_ITEM_KIND_UMBRELLA02, + mPlayer_ITEM_KIND_UMBRELLA03, + mPlayer_ITEM_KIND_UMBRELLA04, + mPlayer_ITEM_KIND_UMBRELLA05, + mPlayer_ITEM_KIND_UMBRELLA06, + mPlayer_ITEM_KIND_UMBRELLA07, + mPlayer_ITEM_KIND_UMBRELLA08, + mPlayer_ITEM_KIND_UMBRELLA09, + mPlayer_ITEM_KIND_UMBRELLA10, + mPlayer_ITEM_KIND_UMBRELLA11, + mPlayer_ITEM_KIND_UMBRELLA12, + mPlayer_ITEM_KIND_UMBRELLA13, + mPlayer_ITEM_KIND_UMBRELLA14, + mPlayer_ITEM_KIND_UMBRELLA15, + mPlayer_ITEM_KIND_UMBRELLA16, + mPlayer_ITEM_KIND_UMBRELLA17, + mPlayer_ITEM_KIND_UMBRELLA18, + mPlayer_ITEM_KIND_UMBRELLA19, + mPlayer_ITEM_KIND_UMBRELLA20, + mPlayer_ITEM_KIND_UMBRELLA21, + mPlayer_ITEM_KIND_UMBRELLA22, + mPlayer_ITEM_KIND_UMBRELLA23, + mPlayer_ITEM_KIND_UMBRELLA24, + mPlayer_ITEM_KIND_UMBRELLA25, + mPlayer_ITEM_KIND_UMBRELLA26, + mPlayer_ITEM_KIND_UMBRELLA27, + mPlayer_ITEM_KIND_UMBRELLA28, + mPlayer_ITEM_KIND_UMBRELLA29, + mPlayer_ITEM_KIND_UMBRELLA30, + mPlayer_ITEM_KIND_UMBRELLA31, + + mPlayer_ITEM_KIND_ORG_UMBRELLA01, + mPlayer_ITEM_KIND_ORG_UMBRELLA02, + mPlayer_ITEM_KIND_ORG_UMBRELLA03, + mPlayer_ITEM_KIND_ORG_UMBRELLA04, + mPlayer_ITEM_KIND_ORG_UMBRELLA05, + mPlayer_ITEM_KIND_ORG_UMBRELLA06, + mPlayer_ITEM_KIND_ORG_UMBRELLA07, + mPlayer_ITEM_KIND_ORG_UMBRELLA08, + + mPlayer_ITEM_KIND_ROD, + mPlayer_ITEM_KIND_GOLD_ROD, + + mPlayer_ITEM_KIND_SHOVEL, + mPlayer_ITEM_KIND_GOLD_SHOVEL, + + mPlayer_ITEM_KIND_RED_BALLOON, + mPlayer_ITEM_KIND_YELLOW_BALLOON, + mPlayer_ITEM_KIND_BLUE_BALLOON, + mPlayer_ITEM_KIND_GREEN_BALLOON, + mPlayer_ITEM_KIND_PURPLE_BALLOON, + mPlayer_ITEM_KIND_BUNNY_P_BALLOON, + mPlayer_ITEM_KIND_BUNNY_B_BALLOON, + mPlayer_ITEM_KIND_BUNNY_O_BALLOON, + + mPlayer_ITEM_KIND_YELLOW_PINWHEEL, + mPlayer_ITEM_KIND_RED_PINWHEEL, + mPlayer_ITEM_KIND_TIGER_PINWHEEL, + mPlayer_ITEM_KIND_GREEN_PINWHEEL, + mPlayer_ITEM_KIND_PINK_PINWHEEL, + mPlayer_ITEM_KIND_STRIPED_PINWHEEL, + mPlayer_ITEM_KIND_FLOWER_PINWHEEL, + mPlayer_ITEM_KIND_FANCY_PINWHEEL, + + mPlayer_ITEM_KIND_BLUEBELL_FAN, + mPlayer_ITEM_KIND_PLUM_FAN, + mPlayer_ITEM_KIND_BAMBOO_FAN, + mPlayer_ITEM_KIND_CLOUD_FAN, + mPlayer_ITEM_KIND_MAPLE_FAN, + mPlayer_ITEM_KIND_FAN_FAN, + mPlayer_ITEM_KIND_FLOWER_FAN, + mPlayer_ITEM_KIND_LEAF_FAN, + + mPlayer_ITEM_KIND_NUM /* Are there more? */ +}; + +enum { + mPlayer_ITEM_DATA_AXE, // model + mPlayer_ITEM_DATA_AXE_B, // model + mPlayer_ITEM_DATA_AXE_C, // model + mPlayer_ITEM_DATA_GOLD_AXE, // model + + mPlayer_ITEM_DATA_NET, // skeleton + mPlayer_ITEM_DATA_GOLD_NET, // skeleton + mPlayer_ITEM_DATA_NET_GET_M, // animation + mPlayer_ITEM_DATA_NET_SWING, // animation + mPlayer_ITEM_DATA_KAMAE_MAIN_M, // animation + mPlayer_ITEM_DATA_KOKERU_GETUP_N, // animation + mPlayer_ITEM_DATA_KOKERU_N, // animation + mPlayer_ITEM_DATA_SWING_WAIT, // animation + mPlayer_ITEM_DATA_YATTA_M, // animation + + mPlayer_ITEM_DATA_ROD, // skeleton + mPlayer_ITEM_DATA_GOLD_ROD, // skeleton + mPlayer_ITEM_DATA_ROD_GET_T, // animation + mPlayer_ITEM_DATA_ROD_MOVE, // animation + mPlayer_ITEM_DATA_ROD_SINARI, // animation + mPlayer_ITEM_DATA_ROD_SWING, // animation + mPlayer_ITEM_DATA_ROD_WAIT, // animation + mPlayer_ITEM_DATA_ROD_NOT_SWING, // animation + + mPlayer_ITEM_DATA_SHOVEL, // model + mPlayer_ITEM_DATA_GOLD_SHOVEL, // model + + mPlayer_ITEM_DATA_BALLOON1, // skeleton + mPlayer_ITEM_DATA_BALLOON2, // skeleton + mPlayer_ITEM_DATA_BALLOON3, // skeleton + mPlayer_ITEM_DATA_BALLOON4, // skeleton + mPlayer_ITEM_DATA_BALLOON5, // skeleton + mPlayer_ITEM_DATA_BALLOON6, // skeleton + mPlayer_ITEM_DATA_BALLOON7, // skeleton + mPlayer_ITEM_DATA_BALLOON8, // skeleton + mPlayer_ITEM_DATA_BALLOON_WAIT, // animation + mPlayer_ITEM_DATA_BALLOON_GYAZA, // animation + + mPlayer_ITEM_DATA_PINWHEEL1, // skeleton + mPlayer_ITEM_DATA_PINWHEEL2, // skeleton + mPlayer_ITEM_DATA_PINWHEEL3, // skeleton + mPlayer_ITEM_DATA_PINWHEEL4, // skeleton + mPlayer_ITEM_DATA_PINWHEEL5, // skeleton + mPlayer_ITEM_DATA_PINWHEEL6, // skeleton + mPlayer_ITEM_DATA_PINWHEEL7, // skeleton + mPlayer_ITEM_DATA_PINWHEEL8, // skeleton + mPlayer_ITEM_DATA_PINWHEEL_WAIT, // animation + + mPlayer_ITEM_DATA_FAN1, // model + mPlayer_ITEM_DATA_FAN2, // model + mPlayer_ITEM_DATA_FAN3, // model + mPlayer_ITEM_DATA_FAN4, // model + mPlayer_ITEM_DATA_FAN5, // model + mPlayer_ITEM_DATA_FAN6, // model + mPlayer_ITEM_DATA_FAN7, // model + mPlayer_ITEM_DATA_FAN8, // model + + mPlayer_ITEM_DATA_NUM +}; + enum { mPlayer_CREATURE_INSECT, mPlayer_CREATURE_GYOEI, diff --git a/src/m_inventory_ovl.c b/src/m_inventory_ovl.c new file mode 100644 index 00000000..b7f71880 --- /dev/null +++ b/src/m_inventory_ovl.c @@ -0,0 +1,362 @@ +#include "m_inventory_ovl.h" + +#include "m_player_lib.h" +#include "ac_set_ovl_gyoei.h" +#include "ac_set_ovl_insect.h" +#include "m_room_type.h" +#include "m_common_data.h" + +enum { + mIV_ANIM_WALK, + mIV_ANIM_CATCH, + mIV_ANIM_CHANGE, + mIV_ANIM_EAT, + + mIV_ANIM_NUM +}; + +enum { + mIV_ITEM_KIND_AXE, + mIV_ITEM_KIND_NET, + mIV_ITEM_KIND_UMBRELLA, + mIV_ITEM_KIND_ROD, + mIV_ITEM_KIND_SHOVEL, + + mIV_ITEM_KIND_GOLD_AXE, + mIV_ITEM_KIND_GOLD_NET, + mIV_ITEM_KIND_GOLD_ROD, + mIV_ITEM_KIND_GOLD_SHOVEL, + + mIV_ITEM_KIND_RED_BALLOON, + mIV_ITEM_KIND_YELLOW_BALLOON, + mIV_ITEM_KIND_BLUE_BALLOON, + mIV_ITEM_KIND_GREEN_BALLOON, + mIV_ITEM_KIND_PURPLE_BALLOON, + mIV_ITEM_KIND_BUNNY_P_BALLOON, + mIV_ITEM_KIND_BUNNY_B_BALLOON, + mIV_ITEM_KIND_BUNNY_O_BALLOON, + + mIV_ITEM_KIND_YELLOW_PINWHEEL, + mIV_ITEM_KIND_RED_PINWHEEL, + mIV_ITEM_KIND_TIGER_PINWHEEL, + mIV_ITEM_KIND_GREEN_PINWHEEL, + mIV_ITEM_KIND_PINK_PINWHEEL, + mIV_ITEM_KIND_STRIPED_PINWHEEL, + mIV_ITEM_KIND_FLOWER_PINWHEEL, + mIV_ITEM_KIND_FANCY_PINWHEEL, + + mIV_ITEM_KIND_BLUEBELL_FAN, + mIV_ITEM_KIND_PLUM_FAN, + mIV_ITEM_KIND_BAMBOO_FAN, + mIV_ITEM_KIND_CLOUD_FAN, + mIV_ITEM_KIND_MAPLE_FAN, + mIV_ITEM_KIND_FAN_FAN, + mIV_ITEM_KIND_FLOWER_FAN, + mIV_ITEM_KIND_LEAF_FAN, + + mIV_ITEM_KIND_AXE_USE_1, + mIV_ITEM_KIND_AXE_USE_2, + mIV_ITEM_KIND_AXE_USE_3, + mIV_ITEM_KIND_AXE_USE_4, + mIV_ITEM_KIND_AXE_USE_5, + mIV_ITEM_KIND_AXE_USE_6, + mIV_ITEM_KIND_AXE_USE_7, + + mIV_ITEM_KIND_NUM +}; + +static int mIV_Get_pl_main_anime_index(int type) { + static u16 player_main_animation_index_table[mIV_ANIM_NUM] = { + mPlayer_ANIM_WALK1, + mPlayer_ANIM_MENU_CATCH1, + mPlayer_ANIM_MENU_CHANGE1, + mPlayer_ANIM_EAT1, + }; + + if (type >= mIV_ANIM_WALK && type < mIV_ANIM_NUM) { + return player_main_animation_index_table[type]; + } + + return -1; +} + +// clang-format off +#define F(n) aSOG_FISH_TYPE_##n + +/* Fish collection layout */ +static u8 mIV_fish_collect_list[] = { + F(CRUCIAN_CARP), F(BROOK_TROUT), F(CARP), F(KOI), F(BARBEL_STEED), F(DACE), F(CATFISH), F(GIANT_CATFISH), + F(PALE_CHUB), F(BITTERLING), F(LOACH), F(BLUEGILL), F(SMALL_BASS), F(BASS), F(LARGE_BASS), F(GIANT_SNAKEHEAD), + F(EEL), F(FRESHWATER_GOBY), F(POND_SMELT), F(SWEETFISH), F(CHERRY_SALMON), F(RAINBOW_TROUT), F(LARGE_CHAR), F(STRINGFISH), + F(SALMON), F(GOLDFISH), F(POPEYED_GOLDFISH), F(GUPPY), F(ANGELFISH), F(PIRANHA), F(AROWANA), F(COELACANTH), + F(CRAWFISH), F(FROG), F(KILLIFISH), F(JELLYFISH), F(SEA_BASS), F(RED_SNAPPER), F(BARRED_KNIFEJAW), F(ARAPAIMA), +}; +#undef F +// clang-format on + +// clang-format off +#define I(n) aSOI_INSECT_TYPE_##n + +/* Insect collection layout */ +static u8 mIV_insect_collect_list[] = { + I(COMMON_BUTTERFLY), I(YELLOW_BUTTERFLY), I(TIGER_BUTTERFLY), I(PURPLE_BUTTERFLY), I(BROWN_CICADA), I(ROBUST_CICADA), I(WALKER_CICADA), I(EVENING_CICADA), + I(RED_DRAGONFLY), I(COMMON_DRAGONFLY), I(DARNER_DRAGONFLY), I(BANDED_DRAGONFLY), I(CRICKET), I(GRASSHOPPER), I(PINE_CRICKET), I(BELL_CRICKET), + I(LADYBUG), I(SPOTTED_LADYBUG), I(MANTIS), I(LONG_LOCUST), I(MIGRATORY_LOCUST), I(COCKROACH), I(BEE), I(FIREFLY), + I(DRONE_BEETLE), I(LONGHORN_BEETLE), I(JEWEL_BEETLE), I(DYNASTID_BEETLE), I(FLAT_STAG_BEETLE), I(SAW_STAG_BEETLE), I(MOUNTAIN_BEETLE), I(GIANT_BEETLE), + I(POND_SKATER), I(ANT), I(PILL_BUG), I(MOSQUITO), I(MOLE_CRICKET), I(SPIDER), I(SNAIL), I(BAGWORM), +}; +#undef I +// clang-format on + +static mActor_name_t mIV_set_collect_itemNo(int type, int page) { + if (type == mIV_PAGE_INSECT_COLLECTION) { + int insect_no = mIV_insect_collect_list[type]; + int bit = mRmTp_FtrItemNo2FtrIdx(FTR_INSECT_START + FTR_NO_2_IDX(insect_no)); + + if (Now_Private->furniture_collected_bitfield[bit >> 5] & (1 << (bit & 31)) != 0) { + return ITM_INSECT_START + insect_no; + } else { + return EMPTY_NO; + } + } else { + int fish_no = mIV_fish_collect_list[type]; + int bit = FTR_IDX_2_NO(FTR_NO_2_IDX(0x31A) + FTR_NO_2_IDX(fish_no)); + + if (Now_Private->furniture_collected_bitfield[bit >> 5] & (1 << (bit & 31)) != 0) { + return mNT_FishIdx2FishItemNo(fish_no); + } else { + return EMPTY_NO; + } + } +} + +static int mIV_get_player_item_anime_id(void) { + mActor_name_t item = Now_Private->equipment; + + if (item >= ITM_NET && item <= ITM_NET) { + return mIV_ITEM_KIND_NET; + } + + if (item == ITM_AXE) { + return mIV_ITEM_KIND_AXE; + } + + if (item == ITM_GOLDEN_AXE) { + return mIV_ITEM_KIND_GOLD_AXE; + } + + if (item == ITM_AXE_USE_1) { + return mIV_ITEM_KIND_AXE_USE_1; + } + + if (item == ITM_AXE_USE_2) { + return mIV_ITEM_KIND_AXE_USE_2; + } + + if (item == ITM_AXE_USE_3) { + return mIV_ITEM_KIND_AXE_USE_3; + } + + if (item == ITM_AXE_USE_4) { + return mIV_ITEM_KIND_AXE_USE_4; + } + + if (item == ITM_AXE_USE_5) { + return mIV_ITEM_KIND_AXE_USE_5; + } + + if (item == ITM_AXE_USE_6) { + return mIV_ITEM_KIND_AXE_USE_6; + } + + if (item == ITM_AXE_USE_7) { + return mIV_ITEM_KIND_AXE_USE_7; + } + + if (item >= ITM_ROD && item <= ITM_ROD) { + return mIV_ITEM_KIND_ROD; + } + + if (item >= ITM_UMBRELLA_START && item <= ITM_MY_ORG_UMBRELLA7) { + return mIV_ITEM_KIND_UMBRELLA; + } + + if (item >= ITM_SHOVEL && item <= ITM_SHOVEL) { + return mIV_ITEM_KIND_SHOVEL; + } + + /* duplicate golden axe check */ + if (item >= ITM_GOLDEN_AXE && item <= ITM_GOLDEN_AXE) { + return mIV_ITEM_KIND_GOLD_AXE; + } + + if (item >= ITM_GOLDEN_NET && item <= ITM_GOLDEN_NET) { + return mIV_ITEM_KIND_GOLD_NET; + } + + if (item >= ITM_GOLDEN_ROD && item <= ITM_GOLDEN_ROD) { + return mIV_ITEM_KIND_GOLD_ROD; + } + + if (item >= ITM_GOLDEN_SHOVEL && item <= ITM_GOLDEN_SHOVEL) { + return mIV_ITEM_KIND_GOLD_SHOVEL; + } + + if (item == ITM_RED_BALLOON) { + return mIV_ITEM_KIND_RED_BALLOON; + } + + if (item == ITM_YELLOW_BALLOON) { + return mIV_ITEM_KIND_YELLOW_BALLOON; + } + + if (item == ITM_BLUE_BALLOON) { + return mIV_ITEM_KIND_BLUE_BALLOON; + } + + if (item == ITM_GREEN_BALLOON) { + return mIV_ITEM_KIND_GREEN_BALLOON; + } + + if (item == ITM_PURPLE_BALLOON) { + return mIV_ITEM_KIND_PURPLE_BALLOON; + } + + if (item == ITM_BUNNY_P_BALLOON) { + return mIV_ITEM_KIND_BUNNY_P_BALLOON; + } + + if (item == ITM_BUNNY_B_BALLOON) { + return mIV_ITEM_KIND_BUNNY_B_BALLOON; + } + + if (item == ITM_BUNNY_O_BALLOON) { + return mIV_ITEM_KIND_BUNNY_O_BALLOON; + } + + if (item == ITM_YELLOW_PINWHEEL) { + return mIV_ITEM_KIND_YELLOW_PINWHEEL; + } + + if (item == ITM_RED_PINWHEEL) { + return mIV_ITEM_KIND_RED_PINWHEEL; + } + + if (item == ITM_TIGER_PINWHEEL) { + return mIV_ITEM_KIND_TIGER_PINWHEEL; + } + + if (item == ITM_GREEN_PINWHEEL) { + return mIV_ITEM_KIND_GREEN_PINWHEEL; + } + + if (item == ITM_PINK_PINWHEEL) { + return mIV_ITEM_KIND_PINK_PINWHEEL; + } + + if (item == ITM_STRIPED_PINWHEEL) { + return mIV_ITEM_KIND_STRIPED_PINWHEEL; + } + + if (item == ITM_FLOWER_PINWHEEL) { + return mIV_ITEM_KIND_FLOWER_PINWHEEL; + } + + if (item == ITM_FANCY_PINWHEEL) { + return mIV_ITEM_KIND_FANCY_PINWHEEL; + } + + if (item == ITM_BLUEBELL_FAN) { + return mIV_ITEM_KIND_BLUEBELL_FAN; + } + + if (item == ITM_PLUM_FAN) { + return mIV_ITEM_KIND_PLUM_FAN; + } + + if (item == ITM_BAMBOO_FAN) { + return mIV_ITEM_KIND_BAMBOO_FAN; + } + + if (item == ITM_CLOUD_FAN) { + return mIV_ITEM_KIND_CLOUD_FAN; + } + + if (item == ITM_MAPLE_FAN) { + return mIV_ITEM_KIND_MAPLE_FAN; + } + + if (item == ITM_FAN_FAN) { + return mIV_ITEM_KIND_FAN_FAN; + } + + if (item == ITM_FLOWER_FAN) { + return mIV_ITEM_KIND_FLOWER_FAN; + } + + if (item == ITM_LEAF_FAN) { + return mIV_ITEM_KIND_LEAF_FAN; + } + + return mIV_ITEM_KIND_NUM; /* No animation */ +} + +static int mIV_ChangeIndex_mIV_to_mPlib(s16 idx) { + static s8 data[] = { + mPlayer_ITEM_KIND_AXE, + mPlayer_ITEM_KIND_NET, + mPlayer_ITEM_KIND_UMBRELLA00, + mPlayer_ITEM_KIND_ROD, + mPlayer_ITEM_KIND_SHOVEL, + + mPlayer_ITEM_KIND_GOLD_AXE, + mPlayer_ITEM_KIND_GOLD_NET, + mPlayer_ITEM_KIND_GOLD_ROD, + mPlayer_ITEM_KIND_GOLD_SHOVEL, + + mPlayer_ITEM_KIND_RED_BALLOON, + mPlayer_ITEM_KIND_YELLOW_BALLOON, + mPlayer_ITEM_KIND_BLUE_BALLOON, + mPlayer_ITEM_KIND_GREEN_BALLOON, + mPlayer_ITEM_KIND_PURPLE_BALLOON, + mPlayer_ITEM_KIND_BUNNY_P_BALLOON, + mPlayer_ITEM_KIND_BUNNY_B_BALLOON, + mPlayer_ITEM_KIND_BUNNY_O_BALLOON, + + mPlayer_ITEM_KIND_YELLOW_PINWHEEL, + mPlayer_ITEM_KIND_RED_PINWHEEL, + mPlayer_ITEM_KIND_TIGER_PINWHEEL, + mPlayer_ITEM_KIND_GREEN_PINWHEEL, + mPlayer_ITEM_KIND_PINK_PINWHEEL, + mPlayer_ITEM_KIND_STRIPED_PINWHEEL, + mPlayer_ITEM_KIND_FLOWER_PINWHEEL, + mPlayer_ITEM_KIND_FANCY_PINWHEEL, + + mPlayer_ITEM_KIND_BLUEBELL_FAN, + mPlayer_ITEM_KIND_PLUM_FAN, + mPlayer_ITEM_KIND_BAMBOO_FAN, + mPlayer_ITEM_KIND_CLOUD_FAN, + mPlayer_ITEM_KIND_MAPLE_FAN, + mPlayer_ITEM_KIND_FAN_FAN, + mPlayer_ITEM_KIND_FLOWER_FAN, + mPlayer_ITEM_KIND_LEAF_FAN, + + mPlayer_ITEM_KIND_AXE_USE_1, + mPlayer_ITEM_KIND_AXE_USE_2, + mPlayer_ITEM_KIND_AXE_USE_3, + mPlayer_ITEM_KIND_AXE_USE_4, + mPlayer_ITEM_KIND_AXE_USE_5, + mPlayer_ITEM_KIND_AXE_USE_6, + mPlayer_ITEM_KIND_AXE_USE_7, + }; + + if (idx >= 0 && idx < mIV_ITEM_KIND_NUM) { + return data[idx]; + } + + return -1; +} + +static int mIV_Get_player_item_shape_index(int idx) { + if (idx >= 0 && idx < mIV_ITEM_KIND_NUM) {} +} From 7478fed14e2788d85645d7a28f7e12e9467d0b30 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Fri, 17 May 2024 00:58:16 -0400 Subject: [PATCH 2/8] Match mSM_copy_cbuf Co-authored-by: SwareJonge --- src/m_submenu_ovl.c | 66 ++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 46 deletions(-) diff --git a/src/m_submenu_ovl.c b/src/m_submenu_ovl.c index 2b5c00ef..5bcd82a2 100644 --- a/src/m_submenu_ovl.c +++ b/src/m_submenu_ovl.c @@ -160,32 +160,23 @@ static void mSM_set_char_matrix(GRAPH* graph) { CLOSE_POLY_OPA_DISP(graph); } -/* @nonmatching - functionally equivalent */ -/* - @note - this function is functionally broken. It was stubbed - in DnM+ and would break if actually used. It is modified - vs its DnM implementation slightly. Additionally, it is entirely - unused. It is set to a func pointer member but that member is - never used. -*/ -#ifndef MUST_MATCH static void mSM_cbuf_copy(GRAPH* graph, PreRender* prerender, int x, int y, int mode) { - s32 src_w; - s32 src_h; - s32 dst_w; - s32 dst_h; + int temp; + int temp0; + int src_w; + int src_h; + int dst_w; + int dst_h; int uls; int ult; int lrs; int lrt; int tmem_line; - int x_min; int y_min; - int y_max; + int x_min; int x_max; + int y_max; int tex_wd; - int temp0; - int temp1; void* src_buffer; void* dst_buffer; @@ -243,23 +234,20 @@ static void mSM_cbuf_copy(GRAPH* graph, PreRender* prerender, int x, int y, int dst_buffer = prerender->framebuffer_bak; } - OPEN_DISP(graph); - - tmem_line = (1 << 12) / (((x_max + 3) & ~3) * 2); + tmem_line = (4 << 10) / ((((x_max + 4) - 1) & ~(4 - 1)) * 2); temp0 = uls + (x_max - 1); - tex_wd = (lrs + x_max - 1) << G_TEXTURE_IMAGE_FRAC; + tex_wd = (lrs + x_max - 1) << 2; + lrs <<= 2; + OPEN_DISP(graph); if (mode) { Gfx* gfx = NOW_POLY_OPA_DISP; - src_w = x - x_min; - src_h = y - y_min; prerender->width = 640; prerender->height = 480; - PreRender_CopyRGBC(prerender, &gfx, src_w, src_h); + PreRender_CopyRGBC(prerender, &gfx, x - x_min, y - y_min); SET_POLY_OPA_DISP(gfx); - } else { gDPPipeSync(NEXT_POLY_OPA_DISP); gSPClearGeometryMode(NEXT_POLY_OPA_DISP, 0xFFFFFF); @@ -275,36 +263,22 @@ static void mSM_cbuf_copy(GRAPH* graph, PreRender* prerender, int x, int y, int tmem_line = y_max; } - gDPLoadTextureTile(NEXT_POLY_OPA_DISP, dst_buffer, G_IM_FMT_RGBA, G_IM_SIZ_16b, src_w, 0, uls, ult, temp0, - (ult + tmem_line - 1), 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD, - G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOLOD); + temp = ult + tmem_line - 1; + gDPLoadTextureTile(NEXT_POLY_OPA_DISP, dst_buffer, G_IM_FMT_RGBA, G_IM_SIZ_16b, src_w, src_h, uls, ult, + temp0, temp, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, + G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); - gSPTextureRectangle(NEXT_POLY_OPA_DISP, lrs << G_TEXTURE_IMAGE_FRAC, lrt << G_TEXTURE_IMAGE_FRAC, tex_wd, - (lrt + tmem_line - 1) << G_TEXTURE_IMAGE_FRAC, G_TX_RENDERTILE, uls << 5, ult << 5, - (1 << 2) << 10, 1 << 10); + gSPTextureRectangle(NEXT_POLY_OPA_DISP, lrs, lrt << 2, tex_wd, (lrt + tmem_line - 1) << 2, G_TX_RENDERTILE, + uls << 5, ult << 5, (4 << 10), (1 << 10)); ult += tmem_line; lrt += tmem_line; y_max -= tmem_line; } } + CLOSE_DISP(graph); } -#else -#pragma push -#pragma force_active on -extern f32 lbl_8064b870; /* 4.0f */ -REL_SYMBOL_AT(lbl_8064b870, 0x8064B870); - -extern f64 lbl_8064b878; /* int -> float magic */ -REL_SYMBOL_AT(lbl_8064b878, 0x8064B878); - -#pragma pop - -static asm void mSM_cbuf_copy(GRAPH* graph, PreRender* prerender, int x, int y, int mode) { -#include "asm/805ed694.s" -} -#endif static void mSM_set_drawMode(GRAPH* graph, PreRender* prerender, f32 eye_dist, f32 eye_height, s16 angle) { static Vp viewport_data = { 0, 0, 511, 0, 0, 0, 511, 0 }; From 482afca7cfb688c96bc2bc0a71ab967812e7d701 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Sun, 19 May 2024 13:17:52 -0400 Subject: [PATCH 3/8] Finish & link m_inventory_ovl --- config/rel_slices.yml | 5 + include/audio_defs.h | 5 + include/libc/math.h | 5 +- include/m_bgm.h | 11 + include/m_inventory_ovl.h | 29 +- include/m_player.h | 24 +- include/m_player_lib.h | 18 + include/m_submenu.h | 9 +- include/m_submenu_ovl.h | 16 +- src/m_bgm.c | 2 +- src/m_catalog_ovl.c | 4 +- src/m_hand_ovl.c | 10 +- src/m_inventory_ovl.c | 2145 +++++++++++++++++++++++++++++++++---- src/m_submenu_ovl.c | 4 +- 14 files changed, 2069 insertions(+), 218 deletions(-) diff --git a/config/rel_slices.yml b/config/rel_slices.yml index 15fd1b0f..1445f1fe 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -970,6 +970,11 @@ m_hboard_ovl.c: .text: [0x805E0AC8, 0x805E1398] .rodata: [0x8064B480, 0x8064B4B8] .data: [0x806CD3B0, 0x806CD3C8] +m_inventory_ovl.c: + .text: [0x805E1398, 0x805E4DFC] + .rodata: [0x8064B4B8, 0x8064B5C8] + .data: [0x806CD3C8, 0x806CD7B8] + .bss: [0x8133FAE0, 0x813400D0] m_map_ovl.c: .text: [0x805E5EFC, 0x805E7A54] .rodata: [0x8064B628, 0x8064B6B0] diff --git a/include/audio_defs.h b/include/audio_defs.h index 332b6aa8..7872a54e 100644 --- a/include/audio_defs.h +++ b/include/audio_defs.h @@ -38,6 +38,9 @@ typedef enum audio_sound_effects { NA_SE_25 = 0x25, NA_SE_26 = 0x26, + NA_SE_MENU_PAUSE = 0x30, + NA_SE_31 = 0x31, + NA_SE_DRAWER_SHUT = 0x3A, NA_SE_ITEM_GET = 0x40, @@ -78,6 +81,8 @@ typedef enum audio_sound_effects { NA_SE_ROD_STROKE = 0x109, NA_SE_ROD_BACK, + NA_SE_EAT = 0x113, + NA_SE_WEAR = 0x11C, NA_SE_SCOOP1 = 0x11E, diff --git a/include/libc/math.h b/include/libc/math.h index a0427698..6cda6927 100644 --- a/include/libc/math.h +++ b/include/libc/math.h @@ -4,6 +4,9 @@ #include "types.h" #define SQRT_OF_2_F 1.41421356237309504880f +#define SQRT_OF_3_F 1.73205080756887729353f + +#define SQRT_3_OVER_3_F (SQRT_OF_3_F / 3.0f) #define M_PI 3.14159265358979323846f @@ -15,4 +18,4 @@ f32 fatan2(f32, f32); f64 fsqrt(f32); f32 facos(f32); -#endif \ No newline at end of file +#endif diff --git a/include/m_bgm.h b/include/m_bgm.h index bad34b58..bac71a79 100644 --- a/include/m_bgm.h +++ b/include/m_bgm.h @@ -9,6 +9,17 @@ extern "C" { #endif +enum { + mBGM_PAUSE_0, + mBGM_PAUSE_1, + mBGM_PAUSE_2, + mBGM_PAUSE_NOTICE, + mBGM_PAUSE_4, + mBGM_PAUSE_STOP, + + mBGM_PAUSE_NUM +}; + extern void mBGMPsComp_make_ps_fanfare(u8 bgm_num, u16 stop_type); extern void mBGMPsComp_make_ps_lost_fanfare(u8 bgm_num, u16 stop_type); extern void mBGMPsComp_make_ps_wipe(u16 stop_type); diff --git a/include/m_inventory_ovl.h b/include/m_inventory_ovl.h index 856a7c8c..757d3a0d 100644 --- a/include/m_inventory_ovl.h +++ b/include/m_inventory_ovl.h @@ -11,9 +11,10 @@ extern "C" { #endif -#define mIV_PLAYER_JOINT_NUM 27 +#define mIV_PLAYER_JOINT_NUM (mPlayer_JOINT_NUM + 1) #define mIV_ITEM_JOINT_NUM 8 #define mIV_PLAYER_EFFECT_NUM 20 +#define mIV_COLLECT_NUM 40 enum { mIV_ITEM_SCALE_TYPE_NONE, @@ -30,11 +31,26 @@ enum { mIV_PAGE_FISH_COLLECTION, mIV_PAGE_INVENTORY, mIV_PAGE_INSECT_COLLECTION, - mIV_PAGE_ORIGINAL_DESIGNS, mIV_PAGE_NUM }; +enum { + mIV_ANIM_WALK, + mIV_ANIM_CATCH, + mIV_ANIM_CHANGE, + mIV_ANIM_EAT, + + mIV_ANIM_NUM +}; + +enum { + mIV_STRING_LAND_NAME, + mIV_STRING_PLAYER_NAME, + + mIV_STRING_NUM +}; + typedef struct inventory_effect_s { int timer; xyz_t pos; @@ -46,8 +62,8 @@ typedef mActor_name_t (*mIV_SET_COLLECT_ITEMNO_PROC)(int, int); /* sizeof (struct inventory_ovl_s) == 0x5EC */ struct inventory_ovl_s { - cKF_SkeletonInfo_R_c player_keyframe0; - cKF_SkeletonInfo_R_c player_keyframe1; + cKF_SkeletonInfo_R_c player_main_keyframe; + cKF_SkeletonInfo_R_c player_com_keyframe; s_xyz player_work[mIV_PLAYER_JOINT_NUM]; s_xyz player_morph[mIV_PLAYER_JOINT_NUM]; @@ -60,8 +76,8 @@ struct inventory_ovl_s { u8 _374[0x3BC - 0x374]; - u16 selected_item_bitfield; - u16 selected_mail_bitfield; + u16 selectable_item_bitfield; + u16 selectable_mail_bitfield; u32 disp_money; int disp_money_change_frames; @@ -74,6 +90,7 @@ struct inventory_ovl_s { u8 food_idx; u8 item_scale_type[mPr_POCKETS_SLOT_COUNT]; u8 page_order[mIV_PAGE_NUM]; + u8 next_page_id; s16 page_move_timer; s16 remove_timer; mIV_pl_eff_c pl_eff[mIV_PLAYER_EFFECT_NUM]; diff --git a/include/m_player.h b/include/m_player.h index f492dbab..d8d2c40c 100644 --- a/include/m_player.h +++ b/include/m_player.h @@ -22,6 +22,8 @@ typedef struct player_actor_s PLAYER_ACTOR; #define mPlayer_FORCE_POSITION_ANGLE_ROTY (1 << 5) #define mPlayer_FORCE_POSITION_ANGLE_ROTZ (1 << 6) +#define mPlayer_JOINT_NUM 26 + enum { mPlayer_ADDRESSABLE_TRUE, mPlayer_ADDRESSABLE_FALSE_MOVEMENT, @@ -364,6 +366,7 @@ enum { mPlayer_ITEM_KIND_UMBRELLA30, mPlayer_ITEM_KIND_UMBRELLA31, + mPlayer_ITEM_KIND_ORG_UMBRELLA00, mPlayer_ITEM_KIND_ORG_UMBRELLA01, mPlayer_ITEM_KIND_ORG_UMBRELLA02, mPlayer_ITEM_KIND_ORG_UMBRELLA03, @@ -371,7 +374,6 @@ enum { mPlayer_ITEM_KIND_ORG_UMBRELLA05, mPlayer_ITEM_KIND_ORG_UMBRELLA06, mPlayer_ITEM_KIND_ORG_UMBRELLA07, - mPlayer_ITEM_KIND_ORG_UMBRELLA08, mPlayer_ITEM_KIND_ROD, mPlayer_ITEM_KIND_GOLD_ROD, @@ -470,6 +472,26 @@ enum { mPlayer_ITEM_DATA_NUM }; +enum { + mPlayer_ITEM_DATA_TYPE_GFX, + mPlayer_ITEM_DATA_TYPE_SKELETON, + mPlayer_ITEM_DATA_TYPE_NET_ANIMATION, + mPlayer_ITEM_DATA_TYPE_ROD_ANIMATION, + mPlayer_ITEM_DATA_TYPE_BALLOON_ANIMATION, + mPlayer_ITEM_DATA_TYPE_PINWHEEL_ANIMATION, + + mPlayer_ITEM_DATA_TYPE_NUM +}; + +enum { + mPlayer_PART_TABLE_NORMAL, + mPlayer_PART_TABLE_AXE, + mPlayer_PART_TABLE_PICK_UP, + mPlayer_PART_TABLE_NET, + + mPlayer_PART_TABLE_NUM +}; + enum { mPlayer_CREATURE_INSECT, mPlayer_CREATURE_GYOEI, diff --git a/include/m_player_lib.h b/include/m_player_lib.h index 8953d623..c5ad6a6d 100644 --- a/include/m_player_lib.h +++ b/include/m_player_lib.h @@ -4,6 +4,7 @@ #include "types.h" #include "m_player.h" #include "m_private_h.h" +#include "c_keyframe.h" #ifdef __cplusplus extern "C" { @@ -79,6 +80,23 @@ extern int mPlib_Check_StopNet(xyz_t* net_pos); extern int mPlib_Check_DigScoop(xyz_t* scoop_pos); extern int mPlib_Check_tree_shaken(const xyz_t* pos); extern int mPlib_Check_VibUnit_OneFrame(const xyz_t* pos); +extern int mPlib_Get_BasicItemShapeIndex_fromItemKind(int item_kind); +extern u8 mPlib_Get_Item_DataPointerType(int idx); +extern void* mPlib_Get_Item_DataPointer(int idx); +extern int mPlib_Get_BasicPlayerAnimeIndex_fromItemKind(int item_kind); +extern cKF_Animation_R_c* mPlib_Get_Pointer_Animation(int anim_idx); +extern int mPlib_Get_BasicPartTableIndex_fromAnimeIndex(int anim_idx); +extern int mPlib_Get_BasicItemAnimeIndex_fromItemKind(int item_kind); +extern void mPlib_DMA_player_Part_Table(s8* part_table_p, int idx); +extern cKF_Skeleton_R_c* mPlib_get_player_mdl_p(void); +extern u8* mPlib_Get_PlayerEyeTexAnimation_p(int anim_idx); +extern u8* mPlib_Get_PlayerMouthTexAnimation_p(int anim_idx); +extern u8* mPlib_Get_eye_tex_p(int idx); +extern u8* mPlib_Get_mouth_tex_p(int idx); +extern u8* mPlib_get_player_tex_p(GAME* game); +extern u16* mPlib_get_player_pallet_p(GAME* game); +extern u16* mPlib_get_player_face_pallet_p(GAME* game); +extern int mPlib_Check_scoop_after(GAME* game, xyz_t* pos, mActor_name_t* item, ACTOR** hit_actor, int gold_shovel); extern mPlayer_change_data_from_submenu_c* mPlib_Get_change_data_from_submenu_p(); diff --git a/include/m_submenu.h b/include/m_submenu.h index caa3fbe6..d67f0c88 100644 --- a/include/m_submenu.h +++ b/include/m_submenu.h @@ -103,7 +103,7 @@ enum { mSM_IV_OPEN_SHRINE, mSM_IV_OPEN_12, mSM_IV_OPEN_EXCHANGE, - mSM_IV_OPEN_14, + mSM_IV_OPEN_CPMAIL, mSM_IV_OPEN_CURATOR, mSM_IV_OPEN_16, @@ -118,6 +118,13 @@ enum { mSM_IV_ITEM_NUM }; +enum { + mSM_HANIWA_OPEN_ENTRUST, + mSM_HANIWA_OPEN_TAKE, + + mSM_HANIWA_OPEN_NUM +}; + enum { mSM_BD_OPEN_WRITE, mSM_BD_OPEN_READ, diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index abee6321..d53e7006 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -28,6 +28,7 @@ #include "m_catalog_ovl_h.h" #include "m_hand_ovl_h.h" #include "m_inventory_ovl_h.h" +#include "m_player.h" #ifdef __cplusplus extern "C" { @@ -65,14 +66,15 @@ typedef struct submenu_ovl_dlftbl_s { int in_ram_flag; } mSM_Ovl_dlftbl_c; -// TODO: fill this out typedef struct submenu_segment_s { int _00; - s16 _04; - s16 _06; - s16 _08; - s16 _0A; - u8 _0C[0x30 - 0x0C]; + s16 player_main_anime_idx; + s16 player_item_anime_idx; + s16 change_player_main_anime_idx; + s16 player_anime_timer; + s16 player_umbrella_bank_idx; + s16 umbrella_ids[2]; + s8 player_part_table[mPlayer_JOINT_NUM + 1]; int dlftbl_loaded_num; mSM_Ovl_dlftbl_c* dlftbl_loaded_tbl[8]; } mSM_Segment_c; @@ -91,7 +93,7 @@ typedef struct submenu_menu_info_s { f32 speed[2]; char* _28; - int _2C; + int open_flag; int next_proc_status; s16 move_drt; diff --git a/src/m_bgm.c b/src/m_bgm.c index daeee328..fd87f8cd 100644 --- a/src/m_bgm.c +++ b/src/m_bgm.c @@ -2653,7 +2653,7 @@ extern void mBGM_reset() { } if (ps_comp->pause_state != 0) { - mBGMPsComp_pause(5); + mBGMPsComp_pause(mBGM_PAUSE_STOP); } mBGMDemo_ct(&bgm->demo); diff --git a/src/m_catalog_ovl.c b/src/m_catalog_ovl.c index faa1e315..0896ca75 100644 --- a/src/m_catalog_ovl.c +++ b/src/m_catalog_ovl.c @@ -527,8 +527,8 @@ static void mCL_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { static void mCL_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { mCL_Ovl_c* catalog_ovl = submenu->overlay->catalog_ovl; - if (menu_info->_2C == FALSE) { - menu_info->_2C = TRUE; + if (menu_info->open_flag == FALSE) { + menu_info->open_flag = TRUE; submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, 14, 0, 0, 0.0f, 0.0f); } else if (catalog_ovl->page_timer != 0) { catalog_ovl->page_timer--; diff --git a/src/m_hand_ovl.c b/src/m_hand_ovl.c index 290dab93..8ad9a644 100644 --- a/src/m_hand_ovl.c +++ b/src/m_hand_ovl.c @@ -310,8 +310,8 @@ static void mHD_drop_item(Submenu* submenu, mTG_tag_c* tag, mActor_name_t* item, submenu->overlay->tag_ovl->init_tag_data_item_win_proc(submenu); - if (overlay->segment._04 == 1) { - overlay->segment._08 = 0; + if (overlay->segment.player_main_anime_idx == mIV_ANIM_CATCH) { + overlay->segment.change_player_main_anime_idx = mIV_ANIM_WALK; } } @@ -515,7 +515,8 @@ static void mHD_open_end_proc_item_type3(Submenu* submenu, int idx, int table) { int category = ITEM_NAME_GET_CAT(item); if (item == RSV_CLOTH || ITEM_IS_CLOTH(item)) { - if (cKF_FrameControl_passCheck_now(&submenu->overlay->inventory_ovl->player_keyframe0.frame_control, 36.0f)) { + if (cKF_FrameControl_passCheck_now(&submenu->overlay->inventory_ovl->player_main_keyframe.frame_control, + 36.0f)) { cloth_p = &Now_Private->cloth; mHD_drop_item(submenu, tag, &cloth_p->item, NULL); @@ -768,7 +769,8 @@ static void mHD_sasu2_move(Submenu* submenu) { int category = ITEM_NAME_GET_CAT(hand_ovl->info.item); if (hand_ovl->info.item == RSV_CLOTH || ITEM_IS_CLOTH(hand_ovl->info.item)) { - if (cKF_FrameControl_passCheck_now(&submenu->overlay->inventory_ovl->player_keyframe0.frame_control, 36.0f)) { + if (cKF_FrameControl_passCheck_now(&submenu->overlay->inventory_ovl->player_main_keyframe.frame_control, + 36.0f)) { mPr_cloth_c* cloth_p = &Now_Private->cloth; u16 cloth_idx; diff --git a/src/m_inventory_ovl.c b/src/m_inventory_ovl.c index b7f71880..59ef3b92 100644 --- a/src/m_inventory_ovl.c +++ b/src/m_inventory_ovl.c @@ -5,15 +5,15 @@ #include "ac_set_ovl_insect.h" #include "m_room_type.h" #include "m_common_data.h" - -enum { - mIV_ANIM_WALK, - mIV_ANIM_CATCH, - mIV_ANIM_CHANGE, - mIV_ANIM_EAT, - - mIV_ANIM_NUM -}; +#include "m_rcp.h" +#include "sys_matrix.h" +#include "m_tag_ovl.h" +#include "m_hand_ovl.h" +#include "m_bgm.h" +#include "zurumode.h" +#include "padmgr.h" +#include "m_play.h" +#include "m_font.h" enum { mIV_ITEM_KIND_AXE, @@ -65,20 +65,7 @@ enum { mIV_ITEM_KIND_NUM }; -static int mIV_Get_pl_main_anime_index(int type) { - static u16 player_main_animation_index_table[mIV_ANIM_NUM] = { - mPlayer_ANIM_WALK1, - mPlayer_ANIM_MENU_CATCH1, - mPlayer_ANIM_MENU_CHANGE1, - mPlayer_ANIM_EAT1, - }; - - if (type >= mIV_ANIM_WALK && type < mIV_ANIM_NUM) { - return player_main_animation_index_table[type]; - } - - return -1; -} +static mIV_Ovl_c inv_ovl_data; // clang-format off #define F(n) aSOG_FISH_TYPE_##n @@ -108,21 +95,36 @@ static u8 mIV_insect_collect_list[] = { #undef I // clang-format on +static int mIV_Get_pl_main_anime_index(int type) { + static u16 player_main_animation_index_table[mIV_ANIM_NUM] = { + mPlayer_ANIM_WALK1, + mPlayer_ANIM_MENU_CATCH1, + mPlayer_ANIM_MENU_CHANGE1, + mPlayer_ANIM_EAT1, + }; + + if (type >= mIV_ANIM_WALK && type < mIV_ANIM_NUM) { + return player_main_animation_index_table[type]; + } + + return -1; +} + static mActor_name_t mIV_set_collect_itemNo(int type, int page) { - if (type == mIV_PAGE_INSECT_COLLECTION) { + if (page == mIV_PAGE_INSECT_COLLECTION) { int insect_no = mIV_insect_collect_list[type]; int bit = mRmTp_FtrItemNo2FtrIdx(FTR_INSECT_START + FTR_NO_2_IDX(insect_no)); - if (Now_Private->furniture_collected_bitfield[bit >> 5] & (1 << (bit & 31)) != 0) { + if (Now_Private->furniture_collected_bitfield[bit >> 5] & (1 << (bit & 31))) { return ITM_INSECT_START + insect_no; } else { return EMPTY_NO; } } else { int fish_no = mIV_fish_collect_list[type]; - int bit = FTR_IDX_2_NO(FTR_NO_2_IDX(0x31A) + FTR_NO_2_IDX(fish_no)); + int bit = FTR_IDX_2_NO(FTR_NO_2_IDX(0x31A) + (u32)FTR_NO_2_IDX(fish_no)); - if (Now_Private->furniture_collected_bitfield[bit >> 5] & (1 << (bit & 31)) != 0) { + if (Now_Private->furniture_collected_bitfield[bit >> 5] & (1 << (bit & 31))) { return mNT_FishIdx2FishItemNo(fish_no); } else { return EMPTY_NO; @@ -130,179 +132,101 @@ static mActor_name_t mIV_set_collect_itemNo(int type, int page) { } } -static int mIV_get_player_item_anime_id(void) { +static s16 mIV_get_player_item_anime_id(void) { mActor_name_t item = Now_Private->equipment; + s16 res; if (item >= ITM_NET && item <= ITM_NET) { - return mIV_ITEM_KIND_NET; + res = mIV_ITEM_KIND_NET; + } else if (item == ITM_AXE) { + res = mIV_ITEM_KIND_AXE; + } else if (item == ITM_GOLDEN_AXE) { + res = mIV_ITEM_KIND_GOLD_AXE; + } else if (item == ITM_AXE_USE_1) { + res = mIV_ITEM_KIND_AXE_USE_1; + } else if (item == ITM_AXE_USE_2) { + res = mIV_ITEM_KIND_AXE_USE_2; + } else if (item == ITM_AXE_USE_3) { + res = mIV_ITEM_KIND_AXE_USE_3; + } else if (item == ITM_AXE_USE_4) { + res = mIV_ITEM_KIND_AXE_USE_4; + } else if (item == ITM_AXE_USE_5) { + res = mIV_ITEM_KIND_AXE_USE_5; + } else if (item == ITM_AXE_USE_6) { + res = mIV_ITEM_KIND_AXE_USE_6; + } else if (item == ITM_AXE_USE_7) { + res = mIV_ITEM_KIND_AXE_USE_7; + } else if (item >= ITM_ROD && item <= ITM_ROD) { + res = mIV_ITEM_KIND_ROD; + } else if (item >= ITM_UMBRELLA_START && item <= ITM_MY_ORG_UMBRELLA7) { + res = mIV_ITEM_KIND_UMBRELLA; + } else if (item >= ITM_SHOVEL && item <= ITM_SHOVEL) { + res = mIV_ITEM_KIND_SHOVEL; + } else if (item >= ITM_GOLDEN_AXE && item <= ITM_GOLDEN_AXE) { /* duplicate golden axe check */ + res = mIV_ITEM_KIND_GOLD_AXE; + } else if (item >= ITM_GOLDEN_NET && item <= ITM_GOLDEN_NET) { + res = mIV_ITEM_KIND_GOLD_NET; + } else if (item >= ITM_GOLDEN_ROD && item <= ITM_GOLDEN_ROD) { + res = mIV_ITEM_KIND_GOLD_ROD; + } else if (item >= ITM_GOLDEN_SHOVEL && item <= ITM_GOLDEN_SHOVEL) { + res = mIV_ITEM_KIND_GOLD_SHOVEL; + } else if (item == ITM_RED_BALLOON) { + res = mIV_ITEM_KIND_RED_BALLOON; + } else if (item == ITM_YELLOW_BALLOON) { + res = mIV_ITEM_KIND_YELLOW_BALLOON; + } else if (item == ITM_BLUE_BALLOON) { + res = mIV_ITEM_KIND_BLUE_BALLOON; + } else if (item == ITM_GREEN_BALLOON) { + res = mIV_ITEM_KIND_GREEN_BALLOON; + } else if (item == ITM_PURPLE_BALLOON) { + res = mIV_ITEM_KIND_PURPLE_BALLOON; + } else if (item == ITM_BUNNY_P_BALLOON) { + res = mIV_ITEM_KIND_BUNNY_P_BALLOON; + } else if (item == ITM_BUNNY_B_BALLOON) { + res = mIV_ITEM_KIND_BUNNY_B_BALLOON; + } else if (item == ITM_BUNNY_O_BALLOON) { + res = mIV_ITEM_KIND_BUNNY_O_BALLOON; + } else if (item == ITM_YELLOW_PINWHEEL) { + res = mIV_ITEM_KIND_YELLOW_PINWHEEL; + } else if (item == ITM_RED_PINWHEEL) { + res = mIV_ITEM_KIND_RED_PINWHEEL; + } else if (item == ITM_TIGER_PINWHEEL) { + res = mIV_ITEM_KIND_TIGER_PINWHEEL; + } else if (item == ITM_GREEN_PINWHEEL) { + res = mIV_ITEM_KIND_GREEN_PINWHEEL; + } else if (item == ITM_PINK_PINWHEEL) { + res = mIV_ITEM_KIND_PINK_PINWHEEL; + } else if (item == ITM_STRIPED_PINWHEEL) { + res = mIV_ITEM_KIND_STRIPED_PINWHEEL; + } else if (item == ITM_FLOWER_PINWHEEL) { + res = mIV_ITEM_KIND_FLOWER_PINWHEEL; + } else if (item == ITM_FANCY_PINWHEEL) { + res = mIV_ITEM_KIND_FANCY_PINWHEEL; + } else if (item == ITM_BLUEBELL_FAN) { + res = mIV_ITEM_KIND_BLUEBELL_FAN; + } else if (item == ITM_PLUM_FAN) { + res = mIV_ITEM_KIND_PLUM_FAN; + } else if (item == ITM_BAMBOO_FAN) { + res = mIV_ITEM_KIND_BAMBOO_FAN; + } else if (item == ITM_CLOUD_FAN) { + res = mIV_ITEM_KIND_CLOUD_FAN; + } else if (item == ITM_MAPLE_FAN) { + res = mIV_ITEM_KIND_MAPLE_FAN; + } else if (item == ITM_FAN_FAN) { + res = mIV_ITEM_KIND_FAN_FAN; + } else if (item == ITM_FLOWER_FAN) { + res = mIV_ITEM_KIND_FLOWER_FAN; + } else if (item == ITM_LEAF_FAN) { + res = mIV_ITEM_KIND_LEAF_FAN; + } else { + res = mIV_ITEM_KIND_NUM; /* No animation */ } - if (item == ITM_AXE) { - return mIV_ITEM_KIND_AXE; - } - - if (item == ITM_GOLDEN_AXE) { - return mIV_ITEM_KIND_GOLD_AXE; - } - - if (item == ITM_AXE_USE_1) { - return mIV_ITEM_KIND_AXE_USE_1; - } - - if (item == ITM_AXE_USE_2) { - return mIV_ITEM_KIND_AXE_USE_2; - } - - if (item == ITM_AXE_USE_3) { - return mIV_ITEM_KIND_AXE_USE_3; - } - - if (item == ITM_AXE_USE_4) { - return mIV_ITEM_KIND_AXE_USE_4; - } - - if (item == ITM_AXE_USE_5) { - return mIV_ITEM_KIND_AXE_USE_5; - } - - if (item == ITM_AXE_USE_6) { - return mIV_ITEM_KIND_AXE_USE_6; - } - - if (item == ITM_AXE_USE_7) { - return mIV_ITEM_KIND_AXE_USE_7; - } - - if (item >= ITM_ROD && item <= ITM_ROD) { - return mIV_ITEM_KIND_ROD; - } - - if (item >= ITM_UMBRELLA_START && item <= ITM_MY_ORG_UMBRELLA7) { - return mIV_ITEM_KIND_UMBRELLA; - } - - if (item >= ITM_SHOVEL && item <= ITM_SHOVEL) { - return mIV_ITEM_KIND_SHOVEL; - } - - /* duplicate golden axe check */ - if (item >= ITM_GOLDEN_AXE && item <= ITM_GOLDEN_AXE) { - return mIV_ITEM_KIND_GOLD_AXE; - } - - if (item >= ITM_GOLDEN_NET && item <= ITM_GOLDEN_NET) { - return mIV_ITEM_KIND_GOLD_NET; - } - - if (item >= ITM_GOLDEN_ROD && item <= ITM_GOLDEN_ROD) { - return mIV_ITEM_KIND_GOLD_ROD; - } - - if (item >= ITM_GOLDEN_SHOVEL && item <= ITM_GOLDEN_SHOVEL) { - return mIV_ITEM_KIND_GOLD_SHOVEL; - } - - if (item == ITM_RED_BALLOON) { - return mIV_ITEM_KIND_RED_BALLOON; - } - - if (item == ITM_YELLOW_BALLOON) { - return mIV_ITEM_KIND_YELLOW_BALLOON; - } - - if (item == ITM_BLUE_BALLOON) { - return mIV_ITEM_KIND_BLUE_BALLOON; - } - - if (item == ITM_GREEN_BALLOON) { - return mIV_ITEM_KIND_GREEN_BALLOON; - } - - if (item == ITM_PURPLE_BALLOON) { - return mIV_ITEM_KIND_PURPLE_BALLOON; - } - - if (item == ITM_BUNNY_P_BALLOON) { - return mIV_ITEM_KIND_BUNNY_P_BALLOON; - } - - if (item == ITM_BUNNY_B_BALLOON) { - return mIV_ITEM_KIND_BUNNY_B_BALLOON; - } - - if (item == ITM_BUNNY_O_BALLOON) { - return mIV_ITEM_KIND_BUNNY_O_BALLOON; - } - - if (item == ITM_YELLOW_PINWHEEL) { - return mIV_ITEM_KIND_YELLOW_PINWHEEL; - } - - if (item == ITM_RED_PINWHEEL) { - return mIV_ITEM_KIND_RED_PINWHEEL; - } - - if (item == ITM_TIGER_PINWHEEL) { - return mIV_ITEM_KIND_TIGER_PINWHEEL; - } - - if (item == ITM_GREEN_PINWHEEL) { - return mIV_ITEM_KIND_GREEN_PINWHEEL; - } - - if (item == ITM_PINK_PINWHEEL) { - return mIV_ITEM_KIND_PINK_PINWHEEL; - } - - if (item == ITM_STRIPED_PINWHEEL) { - return mIV_ITEM_KIND_STRIPED_PINWHEEL; - } - - if (item == ITM_FLOWER_PINWHEEL) { - return mIV_ITEM_KIND_FLOWER_PINWHEEL; - } - - if (item == ITM_FANCY_PINWHEEL) { - return mIV_ITEM_KIND_FANCY_PINWHEEL; - } - - if (item == ITM_BLUEBELL_FAN) { - return mIV_ITEM_KIND_BLUEBELL_FAN; - } - - if (item == ITM_PLUM_FAN) { - return mIV_ITEM_KIND_PLUM_FAN; - } - - if (item == ITM_BAMBOO_FAN) { - return mIV_ITEM_KIND_BAMBOO_FAN; - } - - if (item == ITM_CLOUD_FAN) { - return mIV_ITEM_KIND_CLOUD_FAN; - } - - if (item == ITM_MAPLE_FAN) { - return mIV_ITEM_KIND_MAPLE_FAN; - } - - if (item == ITM_FAN_FAN) { - return mIV_ITEM_KIND_FAN_FAN; - } - - if (item == ITM_FLOWER_FAN) { - return mIV_ITEM_KIND_FLOWER_FAN; - } - - if (item == ITM_LEAF_FAN) { - return mIV_ITEM_KIND_LEAF_FAN; - } - - return mIV_ITEM_KIND_NUM; /* No animation */ + return res; } static int mIV_ChangeIndex_mIV_to_mPlib(s16 idx) { - static s8 data[] = { + static const s8 data[] = { mPlayer_ITEM_KIND_AXE, mPlayer_ITEM_KIND_NET, mPlayer_ITEM_KIND_UMBRELLA00, @@ -358,5 +282,1840 @@ static int mIV_ChangeIndex_mIV_to_mPlib(s16 idx) { } static int mIV_Get_player_item_shape_index(int idx) { - if (idx >= 0 && idx < mIV_ITEM_KIND_NUM) {} + if (idx >= 0 && idx < mIV_ITEM_KIND_NUM) { + int plib_idx = mIV_ChangeIndex_mIV_to_mPlib(idx); + int shape_idx = mPlib_Get_BasicItemShapeIndex_fromItemKind(plib_idx); + + if (shape_idx >= 0 && shape_idx < mPlayer_ITEM_DATA_NUM) { + return shape_idx; + } + + return mPlayer_ITEM_DATA_NUM; + } + + return -1; +} + +static cKF_Skeleton_R_c* mIV_Get_pl_item_skeleton(int idx) { + if (idx >= 0 && idx < mIV_ITEM_KIND_NUM) { + int shape_idx = mIV_Get_player_item_shape_index(idx); + + if (shape_idx >= 0 && shape_idx < mPlayer_ITEM_DATA_NUM) { + u8 data_type = mPlib_Get_Item_DataPointerType(shape_idx); + + if (data_type == mPlayer_ITEM_DATA_TYPE_SKELETON) { + return (cKF_Skeleton_R_c*)mPlib_Get_Item_DataPointer(shape_idx); + } + } + } + + return NULL; +} + +static int mIV_Get_player_com_animation_index(s16 idx) { + return mPlib_Get_BasicPlayerAnimeIndex_fromItemKind(mIV_ChangeIndex_mIV_to_mPlib(idx)); +} + +static cKF_Animation_R_c* mIV_Get_pl_com_anime(s16 idx) { + return mPlib_Get_Pointer_Animation(mIV_Get_player_com_animation_index(idx)); +} + +static int mIV_Get_player_com_part_table_index(s16 idx) { + int plib_idx = mIV_ChangeIndex_mIV_to_mPlib(idx); + int anime_idx = mPlib_Get_BasicPlayerAnimeIndex_fromItemKind(plib_idx); + + return mPlib_Get_BasicPartTableIndex_fromAnimeIndex(anime_idx); +} + +static int mIV_Get_player_item_anime_index(s16 idx) { + int anime_idx = mPlib_Get_BasicItemAnimeIndex_fromItemKind(mIV_ChangeIndex_mIV_to_mPlib(idx)); + + if (anime_idx >= 0 && anime_idx < mPlayer_ITEM_DATA_NUM) { + return anime_idx == mPlayer_ITEM_DATA_BALLOON_GYAZA ? mPlayer_ITEM_DATA_BALLOON_WAIT : anime_idx; + } + + return mPlayer_ITEM_DATA_NUM; +} + +static cKF_Animation_R_c* mIV_Get_pl_item_anime(s16 idx) { + int anime_idx = mIV_Get_player_item_anime_index(idx); + + if (anime_idx >= 0 && anime_idx < mPlayer_ITEM_DATA_NUM) { + return (cKF_Animation_R_c*)mPlib_Get_Item_DataPointer(anime_idx); + } + + return NULL; +} + +static cKF_Animation_R_c* mIV_Get_pl_main_anime(int idx) { + if (idx >= 0 && idx < mIV_ANIM_NUM) { + return mPlib_Get_Pointer_Animation(mIV_Get_pl_main_anime_index(idx)); + } + + return NULL; +} + +static void mIV_pl_load_player_anime(Submenu* submenu, f32 morph_frame) { + mSM_Segment_c* seg = &submenu->overlay->segment; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int main_anim_idx = seg->player_main_anime_idx; + int item_anim_idx = seg->player_item_anime_idx; + int com_type = mIV_ITEM_KIND_NUM; + int unused_idx0 = mIV_Get_pl_main_anime_index(main_anim_idx); + cKF_Animation_R_c* anime = mIV_Get_pl_main_anime(main_anim_idx); + int mode; + int bank_idx; + + if (item_anim_idx != mIV_ITEM_KIND_NUM) { + if (main_anim_idx == mIV_ANIM_EAT) { + com_type = mIV_ITEM_KIND_NET; // ? + } else if (main_anim_idx == mIV_ANIM_WALK) { + com_type = item_anim_idx; + } + } + + if (com_type != mIV_ITEM_KIND_NUM) { + mPlib_DMA_player_Part_Table(seg->player_part_table, mIV_Get_player_com_part_table_index(com_type)); + } else { + mPlib_DMA_player_Part_Table(seg->player_part_table, mPlayer_PART_TABLE_NORMAL); + } + + /* Select animation mode */ + if (main_anim_idx == mIV_ANIM_WALK) { + mode = cKF_FRAMECONTROL_REPEAT; + } else { + mode = cKF_FRAMECONTROL_STOP; + } + + /* Load main animation */ + if (main_anim_idx == mIV_ANIM_CHANGE) { + cKF_SkeletonInfo_R_init_standard_setframeandspeedandmorphandmode(&inv_ovl->player_main_keyframe, anime, NULL, + 1.0f, 1.0f, morph_frame, mode); + } else { + cKF_SkeletonInfo_R_init_standard_setframeandspeedandmorphandmode(&inv_ovl->player_main_keyframe, anime, NULL, + 1.0f, 0.5f, morph_frame, mode); + } + + if (com_type != mIV_ITEM_KIND_NUM) { + int unused_anim1 = mIV_Get_player_com_animation_index(com_type); + + anime = mIV_Get_pl_com_anime(com_type); + } + + /* Load com animation */ + if (main_anim_idx == mIV_ANIM_CHANGE) { + cKF_SkeletonInfo_R_init_standard_setframeandspeedandmorphandmode(&inv_ovl->player_com_keyframe, anime, NULL, + 1.0f, 1.0f, morph_frame, mode); + } else { + cKF_SkeletonInfo_R_init_standard_setframeandspeedandmorphandmode(&inv_ovl->player_com_keyframe, anime, NULL, + 1.0f, 0.5f, morph_frame, mode); + } + + /* Play animations */ + cKF_SkeletonInfo_R_combine_play(&inv_ovl->player_main_keyframe, &inv_ovl->player_com_keyframe, + seg->player_part_table); + + seg->player_umbrella_bank_idx ^= 1; + bank_idx = seg->player_umbrella_bank_idx; + if (item_anim_idx == mIV_ITEM_KIND_UMBRELLA) { + mActor_name_t item = Now_Private->equipment; + + seg->umbrella_ids[bank_idx] = + (item >= ITM_UMBRELLA00 && item <= ITM_MY_ORG_UMBRELLA7) ? (item - ITM_UMBRELLA_START) : EMPTY_NO; + } else if (item_anim_idx != mIV_ITEM_KIND_NUM) { + int unused_shape_idx = mIV_Get_player_item_shape_index(item_anim_idx); + cKF_Skeleton_R_c* item_skel = mIV_Get_pl_item_skeleton(item_anim_idx); + int unused_anim_idx; + cKF_Animation_R_c* item_anim; + + if (item_skel != NULL) { + cKF_SkeletonInfo_R_ct(&inv_ovl->item_keyframe, item_skel, NULL, inv_ovl->item_work, inv_ovl->item_morph); + unused_anim_idx = mIV_Get_player_item_anime_index(item_anim_idx); + item_anim = mIV_Get_pl_item_anime(item_anim_idx); + + if (item_anim_idx >= mIV_ITEM_KIND_YELLOW_PINWHEEL && item_anim_idx <= mIV_ITEM_KIND_FANCY_PINWHEEL) { + cKF_SkeletonInfo_R_init(&inv_ovl->item_keyframe, inv_ovl->item_keyframe.skeleton, item_anim, 1.0f, + (f32)item_anim->frames, 1.0f, 7.5f, 0.0f, cKF_FRAMECONTROL_REPEAT, NULL); + } else { + cKF_SkeletonInfo_R_init(&inv_ovl->item_keyframe, inv_ovl->item_keyframe.skeleton, item_anim, 1.0f, + (f32)item_anim->frames, 1.0f, 0.5f, 0.0f, cKF_FRAMECONTROL_REPEAT, NULL); + } + + cKF_SkeletonInfo_R_play(&inv_ovl->item_keyframe); + } + } +} + +static void mIV_pl_shape_init(Submenu* submenu) { + mSM_Segment_c* seg = &submenu->overlay->segment; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + cKF_SkeletonInfo_R_ct(&inv_ovl->player_main_keyframe, mPlib_get_player_mdl_p(), NULL, inv_ovl->player_work, + inv_ovl->player_morph); + cKF_SkeletonInfo_R_ct(&inv_ovl->player_com_keyframe, mPlib_get_player_mdl_p(), NULL, inv_ovl->player_work, + inv_ovl->player_morph); + seg->player_umbrella_bank_idx = 0; + seg->player_main_anime_idx = mIV_ANIM_WALK; + seg->player_item_anime_idx = mIV_get_player_item_anime_id(); + seg->change_player_main_anime_idx = mIV_ANIM_WALK; + mIV_pl_load_player_anime(submenu, 0.0f); +} + +static void mIV_pl_eff_move(Submenu* submenu) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mIV_pl_eff_c* effect_p = inv_ovl->pl_eff; + int i; + + for (i = 0; i < mIV_PLAYER_EFFECT_NUM; i++) { + if (effect_p->timer != 0) { + effect_p->timer--; + + if (effect_p->timer > 20) { + chase_f(&effect_p->scale, 0.009f, 0.0009f); + } else { + chase_f(&effect_p->scale, 0.0f, 0.00045f); + } + + effect_p->speed += -0.05f; + effect_p->pos.y += effect_p->speed; + } + + effect_p++; + } + + if (submenu->overlay->segment.player_main_anime_idx == mIV_ANIM_CHANGE) { + f32 cur_frame = inv_ovl->player_main_keyframe.frame_control.current_frame; + int effect_no = (int)cur_frame % mIV_PLAYER_EFFECT_NUM; + s16 angle = (int)cur_frame * DEG2SHORT_ANGLE2(-36.0f); + mIV_pl_eff_c* effect_p = &inv_ovl->pl_eff[effect_no]; + + effect_p->timer = 30; + effect_p->speed = 0.0f; + effect_p->scale = 0.0f; + effect_p->pos.x = 22.0f * sin_s(angle) + RANDOM2_F(5.0f); + effect_p->pos.z = 22.0f * cos_s(angle) + RANDOM2_F(5.0f); + effect_p->pos.y = (35.0f / inv_ovl->player_main_keyframe.frame_control.end_frame) * cur_frame + RANDOM2_F(5.0f); + } +} + +static void mIV_pl_check_anm_change(Submenu* submenu) { + mSM_Segment_c* seg = &submenu->overlay->segment; + f32 morph_frame; + + if (seg->change_player_main_anime_idx != seg->player_main_anime_idx) { + if (seg->change_player_main_anime_idx == mIV_ANIM_EAT) { + morph_frame = 6.0f; + } else if (seg->change_player_main_anime_idx == mIV_ANIM_CHANGE) { + morph_frame = -5.0f; + } else if (seg->change_player_main_anime_idx == mIV_ANIM_CATCH) { + morph_frame = -7.0f; + } else if (seg->player_main_anime_idx == mIV_ANIM_CHANGE) { + morph_frame = -5.0f; + } else if (seg->player_main_anime_idx == mIV_ANIM_EAT) { + morph_frame = -5.0f; + } else { + seg->player_item_anime_idx = mIV_get_player_item_anime_id(); + morph_frame = -8.0f; + } + + seg->player_main_anime_idx = seg->change_player_main_anime_idx; + mIV_pl_load_player_anime(submenu, morph_frame); + } +} + +static void mIV_pl_shape_move(Submenu* submenu) { + mSM_Segment_c* seg = &submenu->overlay->segment; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int anim_state = cKF_SkeletonInfo_R_combine_play(&inv_ovl->player_main_keyframe, &inv_ovl->player_com_keyframe, + seg->player_part_table); + + if (seg->player_item_anime_idx != mIV_ITEM_KIND_NUM && + mIV_Get_pl_item_skeleton(seg->player_item_anime_idx) != NULL) { + cKF_SkeletonInfo_R_play(&inv_ovl->item_keyframe); + } + + if (seg->player_anime_timer > 0) { + seg->player_anime_timer--; + } + + mIV_pl_eff_move(submenu); + if (seg->player_main_anime_idx == mIV_ANIM_CATCH) { + seg->player_anime_timer = 8; + } else if (seg->player_main_anime_idx == mIV_ANIM_CHANGE) { + seg->player_anime_timer = 5; + + if (anim_state == cKF_STATE_STOPPED) { + seg->change_player_main_anime_idx = mIV_ANIM_WALK; + } + } else if (seg->player_main_anime_idx == mIV_ANIM_EAT) { + seg->player_anime_timer = 5; + + if (anim_state == cKF_STATE_STOPPED) { + seg->change_player_main_anime_idx = mIV_ANIM_WALK; + } else if (cKF_FrameControl_passCheck_now(&inv_ovl->player_main_keyframe.frame_control, 17.0f)) { + sAdo_SysTrgStart(NA_SE_EAT); + } + } + + mIV_pl_check_anm_change(submenu); +} + +static void mIV_pl_shape_item_draw_net(Submenu* submenu, GAME* game) { + cKF_SkeletonInfo_R_c* item_kf = &submenu->overlay->inventory_ovl->item_keyframe; + Mtx* mtx = (Mtx*)GRAPH_ALLOC_TYPE(game->graph, Mtx, item_kf->skeleton->num_shown_joints); + + if (mtx != NULL) { + cKF_Si3_draw_R_SV(game, item_kf, mtx, NULL, NULL, NULL); + } +} + +static void mIV_pl_shape_item_draw_axe(Submenu* submenu, GAME* game) { + int shape_idx = mIV_Get_player_item_shape_index(submenu->overlay->segment.player_item_anime_idx); + Gfx* axe_gfx = (Gfx*)mPlib_Get_Item_DataPointer(shape_idx); + + if (axe_gfx != NULL) { + OPEN_DISP(game->graph); + + gSPDisplayList(NEXT_POLY_OPA_DISP, axe_gfx); + + CLOSE_DISP(game->graph); + } +} + +typedef struct umbrella_data_s { + Gfx* e_model; + Gfx* kasa_model; +} mIV_umbrella_data_c; + +extern Gfx e_umb01_model[]; +extern Gfx kasa_umb01_model[]; +extern Gfx e_umb02_model[]; +extern Gfx kasa_umb02_model[]; +extern Gfx e_umb03_model[]; +extern Gfx kasa_umb03_model[]; +extern Gfx e_umb04_model[]; +extern Gfx kasa_umb04_model[]; +extern Gfx e_umb05_model[]; +extern Gfx kasa_umb05_model[]; +extern Gfx e_umb06_model[]; +extern Gfx kasa_umb06_model[]; +extern Gfx e_umb07_model[]; +extern Gfx kasa_umb07_model[]; +extern Gfx e_umb08_model[]; +extern Gfx kasa_umb08_model[]; +extern Gfx e_umb09_model[]; +extern Gfx kasa_umb09_model[]; +extern Gfx e_umb10_model[]; +extern Gfx kasa_umb10_model[]; +extern Gfx e_umb11_model[]; +extern Gfx kasa_umb11_model[]; +extern Gfx e_umb12_model[]; +extern Gfx kasa_umb12_model[]; +extern Gfx e_umb13_model[]; +extern Gfx kasa_umb13_model[]; +extern Gfx e_umb14_model[]; +extern Gfx kasa_umb14_model[]; +extern Gfx e_umb15_model[]; +extern Gfx kasa_umb15_model[]; +extern Gfx e_umb16_model[]; +extern Gfx kasa_umb16_model[]; +extern Gfx e_umb17_model[]; +extern Gfx kasa_umb17_model[]; +extern Gfx e_umb18_model[]; +extern Gfx kasa_umb18_model[]; +extern Gfx e_umb19_model[]; +extern Gfx kasa_umb19_model[]; +extern Gfx e_umb20_model[]; +extern Gfx kasa_umb20_model[]; +extern Gfx e_umb21_model[]; +extern Gfx kasa_umb21_model[]; +extern Gfx e_umb22_model[]; +extern Gfx kasa_umb22_model[]; +extern Gfx e_umb23_model[]; +extern Gfx kasa_umb23_model[]; +extern Gfx e_umb24_model[]; +extern Gfx kasa_umb24_model[]; +extern Gfx e_umb25_model[]; +extern Gfx kasa_umb25_model[]; +extern Gfx e_umb26_model[]; +extern Gfx kasa_umb26_model[]; +extern Gfx e_umb27_model[]; +extern Gfx kasa_umb27_model[]; +extern Gfx e_umb28_model[]; +extern Gfx kasa_umb28_model[]; +extern Gfx e_umb29_model[]; +extern Gfx kasa_umb29_model[]; +extern Gfx e_umb30_model[]; +extern Gfx kasa_umb30_model[]; +extern Gfx e_umb31_model[]; +extern Gfx kasa_umb31_model[]; +extern Gfx e_umb32_model[]; +extern Gfx kasa_umb32_model[]; +extern Gfx e_umb_w_model[]; +extern Gfx kasa_umb_w_model[]; + +static void mIV_pl_shape_item_draw_umbrella(Submenu* submenu, GAME* game) { + // clang-format off + static mIV_umbrella_data_c umb_data[] = { + { e_umb01_model, kasa_umb01_model }, + { e_umb02_model, kasa_umb02_model }, + { e_umb03_model, kasa_umb03_model }, + { e_umb04_model, kasa_umb04_model }, + { e_umb05_model, kasa_umb05_model }, + { e_umb06_model, kasa_umb06_model }, + { e_umb07_model, kasa_umb07_model }, + { e_umb08_model, kasa_umb08_model }, + { e_umb09_model, kasa_umb09_model }, + { e_umb10_model, kasa_umb10_model }, + { e_umb11_model, kasa_umb11_model }, + { e_umb12_model, kasa_umb12_model }, + { e_umb13_model, kasa_umb13_model }, + { e_umb14_model, kasa_umb14_model }, + { e_umb15_model, kasa_umb15_model }, + { e_umb16_model, kasa_umb16_model }, + { e_umb17_model, kasa_umb17_model }, + { e_umb18_model, kasa_umb18_model }, + { e_umb19_model, kasa_umb19_model }, + { e_umb20_model, kasa_umb20_model }, + { e_umb21_model, kasa_umb21_model }, + { e_umb22_model, kasa_umb22_model }, + { e_umb23_model, kasa_umb23_model }, + { e_umb24_model, kasa_umb24_model }, + { e_umb25_model, kasa_umb25_model }, + { e_umb26_model, kasa_umb26_model }, + { e_umb27_model, kasa_umb27_model }, + { e_umb28_model, kasa_umb28_model }, + { e_umb29_model, kasa_umb29_model }, + { e_umb30_model, kasa_umb30_model }, + { e_umb31_model, kasa_umb31_model }, + { e_umb32_model, kasa_umb32_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + { e_umb_w_model, kasa_umb_w_model }, + }; + // clang-format on + GRAPH* graph = game->graph; + int umbrella_idx = submenu->overlay->segment.umbrella_ids[submenu->overlay->segment.player_umbrella_bank_idx]; + mIV_umbrella_data_c* umb_data_p = &umb_data[umbrella_idx]; + int umbrella_item_kind = mPlayer_ITEM_KIND_UMBRELLA00 + umbrella_idx; + + _texture_z_light_fog_prim_npc(graph); + + OPEN_POLY_OPA_DISP(graph); + + gSPLoadGeometryMode(POLY_OPA_DISP++, G_ZBUFFER | G_SHADE | G_FOG | G_LIGHTING | G_SHADING_SMOOTH); + + Matrix_RotateY(DEG2SHORT_ANGLE2(-90.0f), 1); + Matrix_translate(800.0f, 0.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++, umb_data_p->e_model); + Matrix_translate(4000.0f, 0.0f, 0.0f, 1); + + /* Handle custom designs */ + if (umbrella_item_kind >= mPlayer_ITEM_KIND_ORG_UMBRELLA00) { + int org_idx = (umbrella_item_kind - mPlayer_ITEM_KIND_ORG_UMBRELLA00) & 7; + + gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_8, mNW_PaletteIdx2Palette(Now_Private->my_org[org_idx].palette)); + gSPSegment(POLY_OPA_DISP++, G_MWO_SEGMENT_9, Now_Private->my_org[org_idx].design.data); + } + + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, umb_data_p->kasa_model); + + CLOSE_POLY_OPA_DISP(graph); +} + +extern Gfx inv_uki_model[]; // rod +extern Gfx inv_uki2_model[]; // golden rod + +static void mIV_pl_shape_item_draw_rod(Submenu* submenu, GAME* game) { + mSM_Segment_c* seg = &submenu->overlay->segment; + cKF_SkeletonInfo_R_c* item_kf = &submenu->overlay->inventory_ovl->item_keyframe; + Mtx* mtx = (Mtx*)GRAPH_ALLOC_TYPE(game->graph, Mtx, item_kf->skeleton->num_shown_joints); + + if (mtx != NULL) { + xyz_t pos; + + Matrix_Position_VecZ(&pos, 1500.0f); + cKF_Si3_draw_R_SV(game, item_kf, mtx, NULL, NULL, NULL); + Matrix_put(&submenu->overlay->inventory_ovl->item_mtx); + Matrix_translate(0.0f, 0.0f, 1500.0f, 1); + Matrix_RotateZ(DEG2SHORT_ANGLE2(24.219360f), 1); // 0x1139 + Matrix_RotateX(DEG2SHORT_ANGLE2(65.494995f), 1); // 0x2E93 + Matrix_RotateY(DEG2SHORT_ANGLE2(79.634399f), 1); // 0x38A1 + Matrix_translate(0.0f, -500.0f, 0.0f, 1); + + OPEN_DISP(game->graph); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (seg->player_item_anime_idx == mIV_ITEM_KIND_GOLD_ROD) { + gSPDisplayList(NEXT_POLY_OPA_DISP, inv_uki2_model); + } else { + gSPDisplayList(NEXT_POLY_OPA_DISP, inv_uki_model); + } + + CLOSE_DISP(game->graph); + } +} + +static void mIV_pl_shape_item_draw_scoop(Submenu* submenu, GAME* game) { + int shape_idx = mIV_Get_player_item_shape_index(submenu->overlay->segment.player_item_anime_idx); + Gfx* scoop_gfx = (Gfx*)mPlib_Get_Item_DataPointer(shape_idx); + + if (scoop_gfx != NULL) { + OPEN_DISP(game->graph); + + gSPDisplayList(NEXT_POLY_OPA_DISP, scoop_gfx); + + CLOSE_DISP(game->graph); + } +} + +static int mIV_pl_shape_item_draw_balloon_Before(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, + Gfx** joint_shape, u8* joint_flags, void* arg, s_xyz* joint_rot, + xyz_t* joint_pos) { + switch (joint_idx) { + case 1: + case 2: + case 3: { + OPEN_DISP(game->graph); + + gDPPipeSync(NEXT_POLY_OPA_DISP); + gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, 80); + + CLOSE_DISP(game->graph); + break; + } + } + + return TRUE; +} + +static int mIV_pl_shape_item_draw_balloon_After(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, + Gfx** joint_shape, u8* joint_flags, void* arg, s_xyz* joint_rot, + xyz_t* joint_pos) { + switch (joint_idx) { + case 1: + case 2: + case 3: { + OPEN_DISP(game->graph); + + gDPPipeSync(NEXT_POLY_OPA_DISP); + gDPSetTexEdgeAlpha(NEXT_POLY_OPA_DISP, 144); + + CLOSE_DISP(game->graph); + break; + } + } + + return TRUE; +} + +static void mIV_pl_shape_item_draw_balloon(Submenu* submenu, GAME* game) { + cKF_SkeletonInfo_R_c* item_kf = &submenu->overlay->inventory_ovl->item_keyframe; + Mtx* mtx = (Mtx*)GRAPH_ALLOC_TYPE(game->graph, Mtx, item_kf->skeleton->num_shown_joints); + + if (mtx != NULL) { + static xyz_t dummy_eye = { 0.0f, 0.0f, 1.0f }; + static xyz_t dummy_light_direction = { -SQRT_3_OVER_3_F, SQRT_3_OVER_3_F, SQRT_3_OVER_3_F }; + GRAPH* graph = game->graph; + Hilite* hilite; + + OPEN_DISP(graph); + + SET_POLY_OPA_DISP( + HiliteReflect_new(&ZeroVec, &dummy_eye, &dummy_light_direction, graph, NOW_POLY_OPA_DISP, &hilite)); + + CLOSE_DISP(graph); + + cKF_Si3_draw_R_SV(game, item_kf, mtx, &mIV_pl_shape_item_draw_balloon_Before, + &mIV_pl_shape_item_draw_balloon_After, NULL); + } +} + +static void mIV_pl_shape_item_draw_windmill(Submenu* submenu, GAME* game) { + cKF_SkeletonInfo_R_c* item_kf = &submenu->overlay->inventory_ovl->item_keyframe; + Mtx* mtx = (Mtx*)GRAPH_ALLOC_TYPE(game->graph, Mtx, item_kf->skeleton->num_shown_joints); + + if (mtx != NULL) { + cKF_Si3_draw_R_SV(game, item_kf, mtx, NULL, NULL, NULL); + } +} + +static void mIV_pl_shape_item_draw_fan(Submenu* submenu, GAME* game) { + int shape_idx = mIV_Get_player_item_shape_index(submenu->overlay->segment.player_item_anime_idx); + Gfx* fan_gfx = (Gfx*)mPlib_Get_Item_DataPointer(shape_idx); + + if (fan_gfx != NULL) { + OPEN_DISP(game->graph); + + gSPDisplayList(NEXT_POLY_OPA_DISP, fan_gfx); + + CLOSE_DISP(game->graph); + } +} + +static int mIV_pl_shape_after_draw(GAME* game, cKF_SkeletonInfo_R_c* keyframe, int joint_idx, Gfx** joint_shape, + u8* joint_flags, void* arg, s_xyz* joint_rot, xyz_t* joint_pos) { + switch (joint_idx) { + case 20: { + Submenu* submenu = (Submenu*)arg; + + if (submenu->overlay->segment.player_item_anime_idx != mIV_ITEM_KIND_NUM) { + Matrix_get(&submenu->overlay->inventory_ovl->item_mtx); + } + + break; + } + + case 16: { + Submenu* submenu = (Submenu*)arg; + + if (submenu->overlay->segment.player_main_anime_idx == mIV_ANIM_EAT) { + Matrix_get(&submenu->overlay->inventory_ovl->food_mtx); + } + + break; + } + } + + return TRUE; +} + +typedef void (*mIV_PL_EQUIP_ITEM_DRAW_PROC)(Submenu*, GAME*); + +static void mIV_pl_equip_item_draw(Submenu* submenu, GAME* game) { + // clang-format off + static mIV_PL_EQUIP_ITEM_DRAW_PROC proc[mIV_ITEM_KIND_NUM] = { + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_net, + &mIV_pl_shape_item_draw_umbrella, + &mIV_pl_shape_item_draw_rod, + &mIV_pl_shape_item_draw_scoop, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_net, + &mIV_pl_shape_item_draw_rod, + &mIV_pl_shape_item_draw_scoop, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_balloon, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_windmill, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_fan, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_axe, + &mIV_pl_shape_item_draw_axe, + }; + // clang-format on + + mSM_Segment_c* seg = &submenu->overlay->segment; + + if (seg->player_item_anime_idx != mIV_ITEM_KIND_NUM) { + GRAPH* graph = game->graph; + + Matrix_put(&submenu->overlay->inventory_ovl->item_mtx); + + OPEN_DISP(graph); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + CLOSE_DISP(graph); + + (*proc[seg->player_item_anime_idx])(submenu, game); + } +} + +extern Gfx apple_DL_mode[]; +extern Gfx nuts_DL_mode[]; +extern Gfx pear_DL_mode[]; +extern Gfx peach_DL_mode[]; +extern Gfx orange_DL_mode[]; +extern Gfx matutake_DL_mode[]; +extern Gfx obj_item_cocoT_mat_model[]; +extern Gfx kabu_DL_mode[]; + +extern Gfx apple_DL_vtx[]; +extern Gfx nuts_DL_vtx[]; +extern Gfx pear_DL_vtx[]; +extern Gfx peach_DL_vtx[]; +extern Gfx orange_DL_vtx[]; +extern Gfx matutake_DL_vtx[]; +extern Gfx obj_shop_candy_modelT[]; +extern Gfx obj_item_cocoT_gfx_model[]; +extern Gfx kabu_DL_vtx[]; + +static void mIV_pl_food_item_draw(Submenu* submenu, GAME* game) { + // clang-format off + static Gfx* food_mode[] = { + apple_DL_mode, + nuts_DL_mode, + pear_DL_mode, + peach_DL_mode, + orange_DL_mode, + matutake_DL_mode, + NULL, + obj_item_cocoT_mat_model, + kabu_DL_mode, + }; + // clang-format on + + // clang-format off + static Gfx* food_model[] = { + apple_DL_vtx, + nuts_DL_vtx, + pear_DL_vtx, + peach_DL_vtx, + orange_DL_vtx, + matutake_DL_vtx, + obj_shop_candy_modelT, + obj_item_cocoT_gfx_model, + kabu_DL_vtx, + }; + // clang-format on + + if (submenu->overlay->segment.player_main_anime_idx == mIV_ANIM_EAT) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + f32 cur_frame = inv_ovl->player_main_keyframe.frame_control.current_frame; + f32 rate; + GRAPH* graph = game->graph; + int food_idx = inv_ovl->food_idx; + MtxF* mtxf; + f32 scale; + f32 tmp; + xyz_t l_ofs; + xyz_t w_ofs; + + if (cur_frame < 3.0f || cur_frame >= 46.0f) { + return; + } + + if (cur_frame < 12.0f) { + tmp = (cur_frame - 3.0f) * (1.0f / 9.0f); + l_ofs.x = (tmp * 1.5f + 12.5f) * 100.0f; + l_ofs.y = (tmp * 3.0f + 5.0f) * 100.0f; + l_ofs.z = (tmp * -7.0f) * 100.0f; + } else { + tmp = (cur_frame - 12.0f) * (1.0f / 34.0f); + l_ofs.x = (tmp * -5.0f + 14.0f) * 100.0f; + l_ofs.y = (tmp * -11.75f + 8.0f) * 100.0f; + l_ofs.z = (tmp * 6.0f + -7.0f) * 100.0f; + } + + if (cur_frame < 27.0f) { + scale = 1.0f; + } else { + scale = 1.0f - (cur_frame - 27.0f) * (1.0f / 19.0f); + } + + scale *= 0.01f; + + _texture_z_light_fog_prim(graph); + Matrix_put(&submenu->overlay->inventory_ovl->food_mtx); + Matrix_Position(&l_ofs, &w_ofs); + + /* Update draw matrix */ + mtxf = get_Matrix_now(); + + /* Scale */ + mtxf->xx = scale; + mtxf->yy = scale; + mtxf->zz = scale; + + mtxf->yx = 0.0f; + mtxf->zx = 0.0f; + mtxf->xy = 0.0f; + mtxf->zy = 0.0f; + mtxf->xz = 0.0f; + mtxf->yz = 0.0f; + + /* Position */ + mtxf->xw = w_ofs.x; + mtxf->yw = w_ofs.y - scale * 884.0f; + mtxf->zw = w_ofs.z; + + OPEN_DISP(graph); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (food_mode[food_idx] != NULL) { + gSPDisplayList(NEXT_POLY_OPA_DISP, food_mode[food_idx]); + } + + gSPDisplayList(NEXT_POLY_OPA_DISP, food_model[food_idx]); + + CLOSE_DISP(graph); + } +} + +static void mIV_pl_shape_draw(Submenu* submenu, GAME* game) { + mSM_Segment_c* seg = &submenu->overlay->segment; + cKF_SkeletonInfo_R_c* main_kf = &submenu->overlay->inventory_ovl->player_main_keyframe; + GRAPH* graph = game->graph; + Mtx* mtx = (Mtx*)GRAPH_ALLOC_TYPE(graph, Mtx, main_kf->skeleton->num_shown_joints); + u8* eye_tex_p = NULL; + u8* mouth_tex_p = NULL; + int anim_idx = mIV_Get_pl_main_anime_index(seg->player_main_anime_idx); + u8* eye_tex_anim_p = mPlib_Get_PlayerEyeTexAnimation_p(anim_idx); + u8* mouth_tex_anim_p = mPlib_Get_PlayerMouthTexAnimation_p(anim_idx); + + if (mtx != NULL) { + OPEN_DISP(graph); + + if (eye_tex_anim_p != NULL || mouth_tex_anim_p != NULL) { + cKF_FrameControl_c* frame_ctrl = &main_kf->frame_control; + f32 cur_frame = frame_ctrl->current_frame; + f32 max_frame = frame_ctrl->max_frames; + + if (1.0f <= cur_frame && cur_frame <= max_frame) { + int tex_anim_idx = (int)(cur_frame - 1.0f); + + if (eye_tex_anim_p != NULL) { + eye_tex_p = mPlib_Get_eye_tex_p(eye_tex_anim_p[tex_anim_idx]); + } + + if (mouth_tex_anim_p != NULL) { + mouth_tex_p = mPlib_Get_mouth_tex_p(mouth_tex_anim_p[tex_anim_idx]); + } + } + } + + /* Load default textures if no animation */ + if (eye_tex_p == NULL) { + eye_tex_p = mPlib_Get_eye_tex_p(0); + } + + if (mouth_tex_p == NULL) { + mouth_tex_p = mPlib_Get_mouth_tex_p(0); + } + + Matrix_scale(0.01f, 0.01f, 0.01f, 0); + + gDPPipeSync(NEXT_POLY_OPA_DISP); + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + _texture_z_light_fog_prim(graph); + + /* Set dynamic player data */ + gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_8, eye_tex_p); + gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_9, mouth_tex_p); + gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_A, mPlib_get_player_tex_p(game)); + gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_B, mPlib_get_player_pallet_p(game)); + gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_C, mPlib_get_player_face_pallet_p(game)); + + CLOSE_DISP(graph); + + /* Draw skeleton */ + cKF_Si3_draw_R_SV(game, main_kf, mtx, NULL, &mIV_pl_shape_after_draw, submenu); + mIV_pl_equip_item_draw(submenu, game); + mIV_pl_food_item_draw(submenu, game); + } +} + +extern Gfx ef_takurami01_menu_render_mode[]; +extern Gfx ef_takurami01_kira_modelT[]; + +static void mIV_pl_eff_draw(GRAPH* graph, Submenu* submenu) { + int i; + mIV_pl_eff_c* pl_eff; + + _texture_z_light_fog_prim(graph); + OPEN_DISP(graph); + + pl_eff = submenu->overlay->inventory_ovl->pl_eff; + gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_8, ef_takurami01_menu_render_mode); + for (i = 0; i < mIV_PLAYER_EFFECT_NUM; i++) { + if (pl_eff->timer != 0) { + Matrix_translate(pl_eff->pos.x, pl_eff->pos.y, pl_eff->pos.z, 0); + Matrix_scale(pl_eff->scale, pl_eff->scale, pl_eff->scale, 1); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(NEXT_POLY_OPA_DISP, ef_takurami01_kira_modelT); + } + + pl_eff++; + } + + CLOSE_DISP(graph); +} + +extern Gfx ef_shadow_in_modelT[]; + +static void mIV_pl_shadow_draw(GAME_PLAY* play, ACTOR* actorx) { + if (actorx != NULL) { + GRAPH* graph = play->game.graph; + + Matrix_scale(actorx->shape_info.shadow_size_x * 0.001f, 1.0f, actorx->shape_info.shadow_size_z * 0.001f, 0); + _texture_z_light_fog_prim(graph); + + OPEN_DISP(graph); + + gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(NEXT_POLY_OPA_DISP, 0, 255, 10, 0, 40, 150); + gSPDisplayList(NEXT_POLY_OPA_DISP, ef_shadow_in_modelT); + + CLOSE_DISP(graph); + } +} + +static void mIV_set_player(Submenu* submenu, GRAPH* graph, GAME_PLAY* play, f32 pos_x, f32 pos_y) { + PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play); + + if (player != NULL) { + int x = (int)pos_x + 20; + int y = (int)-pos_y + 9; + /* NOTE: 128.0 and 0.0 are doubles here */ + int draw_flag = (128.0 + x >= 0.0) && (x < 320); + + OPEN_DISP(graph); + + gDPPipeSync(NEXT_POLY_OPA_DISP); + + CLOSE_DISP(graph); + + if (draw_flag) { + submenu->overlay->change_view_proc(graph, 330.0f, 25.0f, x * 4.0f, y * 4.0f, 0x900, 256, 256); + } + + mIV_pl_check_anm_change(submenu); + if (draw_flag) { + mIV_pl_shadow_draw(play, (ACTOR*)player); + mIV_pl_shape_draw(submenu, (GAME*)play); + mIV_pl_eff_draw(graph, submenu); + } + + submenu->overlay->setup_view_proc(submenu, graph, FALSE); + } +} + +static void mIV_move_Move(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + submenu->overlay->move_Move_proc(submenu, menu_info); +} + +static void mIV_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mSM_Control_c* ctrl = &submenu->overlay->menu_control; + mTG_Ovl_c* tag_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + if (menu_info->open_flag == FALSE) { + int unselected_num; + + tag_ovl = submenu->overlay->tag_ovl; + if (menu_info->data0 == mSM_IV_OPEN_SEND_MAIL) { + for (unselected_num = 0; unselected_num < mPr_INVENTORY_MAIL_COUNT; unselected_num++) { + if (inv_ovl->selectable_mail_bitfield & (1 << unselected_num)) { + break; + } + } + + if (unselected_num == mPr_INVENTORY_MAIL_COUNT) { + unselected_num = 0; + } + } else { + for (unselected_num = 0; unselected_num < mPr_POCKETS_SLOT_COUNT; unselected_num++) { + if (inv_ovl->selectable_item_bitfield & (1 << unselected_num)) { + break; + } + } + + if (unselected_num == mPr_POCKETS_SLOT_COUNT) { + unselected_num = 0; + } + } + + switch (menu_info->data0) { + case mSM_IV_OPEN_NORMAL: + case mSM_IV_OPEN_SELL: + case mSM_IV_OPEN_GIVE: + case mSM_IV_OPEN_TAKE: + case mSM_IV_OPEN_PUTIN_FTR: + case mSM_IV_OPEN_MINIDISK: + case mSM_IV_OPEN_SHRINE: + case mSM_IV_OPEN_CURATOR: + case mSM_IV_OPEN_16: + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_ITEM, mTG_TYPE_NONE, unselected_num, + 0.0f, 0.0f); + break; + case mSM_IV_OPEN_EXCHANGE: + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_ITEM, mTG_TYPE_NONE, unselected_num, + 0.0f, 0.0f); + submenu->overlay->hand_ovl->info.pos[0] += -5.0f; + submenu->overlay->hand_ovl->info.pos[1] += 12.0f; + break; + case mSM_IV_OPEN_QUEST: + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_ITEM, mTG_TYPE_NONE, unselected_num, + 0.0f, 0.0f); + tag_ovl->item_name_wait_time = 0; + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_ITEM, mTG_TYPE_QUEST_ITEM, 0, + tag_ovl->tags[0].pos[0], tag_ovl->tags[0].pos[1]); + break; + case mSM_IV_OPEN_SEND_MAIL: + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_MAIL, mTG_TYPE_NONE, unselected_num, + 0.0f, 0.0f); + break; + } + + menu_info->open_flag = TRUE; + } else if (inv_ovl->page_move_timer != 0) { + int y; + + inv_ovl->page_move_timer--; + y = 100.0f * sinf_table((f32)inv_ovl->page_move_timer * 0.078539819f); + menu_info->position[1] = (f32)y; + + if (inv_ovl->page_move_timer == 20) { + if (inv_ovl->page_order[2] == inv_ovl->next_page_id) { + inv_ovl->page_order[2] = inv_ovl->page_order[1]; + } + + inv_ovl->page_order[1] = inv_ovl->page_order[0]; + inv_ovl->page_order[0] = inv_ovl->next_page_id; + } else if (inv_ovl->page_move_timer == 0) { + menu_info->position[1] = 0.0f; + submenu->overlay->hand_ovl->set_hand_func(submenu); + } + } else { + ctrl->tag_move_func(submenu, menu_info); + } +} + +static void mIV_move_Wait(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mSM_Control_c* ctrl = &submenu->overlay->menu_control; + mSM_MenuInfo_c* next_menu_info = &submenu->overlay->menu_info[menu_info->next_menu_type]; + + if (next_menu_info->menu_type == mSM_OVL_NEEDLEWORK) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + mIV_pl_shape_move(submenu); + ctrl->animation_flag = TRUE; + if (inv_ovl->original_flag) { + if (next_menu_info->proc_status == mSM_OVL_PROC_MOVE && + next_menu_info->next_proc_status == mSM_OVL_PROC_END) { + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_OUT_RIGHT); + } + } else if (next_menu_info->proc_status == mSM_OVL_PROC_END) { + mTG_Ovl_c* tag_ovl; + mTG_tag_c* tag; + int i; + + menu_info->proc_status = mSM_OVL_PROC_PLAY; + tag_ovl = submenu->overlay->tag_ovl; + tag = tag_ovl->tags; + + for (i = 0; i < mTG_TAG_NUM; i++) { + tag->type = mTG_TYPE_NONE; + tag++; + } + + tag_ovl->sel_tag_idx = -1; + tag_ovl->ret_tag_idx = -1; + inv_ovl->wc_flag = FALSE; + + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_INVENTORY_WC_ORG, mTG_TYPE_NONE, 0, 0.0f, + 0.0f); + submenu->overlay->tag_ovl->init_tag_data_item_win_proc(submenu); + } + } else if (next_menu_info->proc_status == mSM_OVL_PROC_MOVE && + next_menu_info->next_proc_status == mSM_OVL_PROC_END) { + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_IN_LEFT); + submenu->overlay->tag_ovl->init_tag_data_item_win_proc(submenu); + } +} + +static void mIV_move_Obey(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + 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) { + if (next_menu_info->next_proc_status == mSM_OVL_PROC_END) { + int move_dir; + + if (menu_info->data0 == mSM_IV_OPEN_CPMAIL) { + move_dir = mSM_MOVE_OUT_LEFT; + sAdo_SysTrgStart(NA_SE_31); + } else { + move_dir = mSM_MOVE_OUT_RIGHT; + } + + submenu->overlay->move_chg_base_proc(menu_info, move_dir); + } else { + menu_info->position[0] = next_menu_info->position[0]; + menu_info->position[1] = next_menu_info->position[1]; + } + } +} + +static void mIV_move_End(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mBGMPsComp_pause(mBGM_PAUSE_STOP); + submenu->overlay->move_End_proc(submenu, menu_info); +} + +typedef void (*mIV_OVL_MOVE_PROC)(Submenu*, mSM_MenuInfo_c*); + +static void mIV_inventory_ovl_move(Submenu* submenu) { + // clang-format off + static mIV_OVL_MOVE_PROC ovl_move_proc[] = { + &mIV_move_Move, + &mIV_move_Play, + &mIV_move_Wait, + &mIV_move_Obey, + &mIV_move_End, + }; + // clang-format on + + mSM_Control_c* ctrl = &submenu->overlay->menu_control; + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_INVENTORY]; + + menu_info->pre_move_func(submenu); + (*ovl_move_proc[menu_info->proc_status])(submenu, menu_info); + + switch (menu_info->proc_status) { + case mSM_OVL_PROC_PLAY: { + mIV_pl_shape_move(submenu); + ctrl->animation_flag = TRUE; + + /** + * Debug controls on controller #2 + * - C stick left: +1,000 added to wallet + * - C stick right: fill all free inventory spaces with 30,000 bell bags + * - C stick down: fill first 4 free inventory slots with all tools + */ + if (menu_info->data0 == mSM_IV_OPEN_NORMAL && ZURUMODE2_ENABLED() && zurumode_flag != 0) { + if ((gamePT->pads[PAD1].on.button & BUTTON_CLEFT) == BUTTON_CLEFT) { + u32 wallet = Now_Private->inventory.wallet + 1000; + + if (wallet > mPr_WALLET_MAX) { + wallet = mPr_WALLET_MAX; + } + + Now_Private->inventory.wallet = wallet; + submenu->overlay->inventory_ovl->disp_money = wallet; + } + + if ((gamePT->pads[PAD1].on.button & BUTTON_CDOWN) == BUTTON_CDOWN) { + int i; + + for (i = 0; i < MONEY_NUM; i++) { + int idx = mPr_GetPossessionItemIdxWithCond(Now_Private, EMPTY_NO, mPr_ITEM_COND_NORMAL); + + if (idx == -1) { + break; + } + + mPr_SetPossessionItem(Now_Private, idx, ITM_TOOL_START + i, mPr_ITEM_COND_NORMAL); + } + } + + if ((gamePT->pads[PAD1].on.button & BUTTON_CRIGHT) == BUTTON_CRIGHT) { + int i; + + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + int idx = mPr_GetPossessionItemIdxWithCond(Now_Private, EMPTY_NO, mPr_ITEM_COND_NORMAL); + + if (idx == -1) { + break; + } + + mPr_SetPossessionItem(Now_Private, idx, ITM_MONEY_30000, mPr_ITEM_COND_NORMAL); + } + } + } + break; + } + + case mSM_OVL_PROC_MOVE: { + ctrl->animation_flag = FALSE; + break; + } + } +} + +extern Gfx inv_mwin_mode[]; +extern Gfx inv_sakana_model[]; +extern Gfx inv_mwin_model[]; +extern Gfx inv_mushi_model[]; +extern Gfx inv_sakana_part_model[]; +extern Gfx inv_mushi_part_model[]; +extern Gfx inv_sakana_scroll_mode[]; +extern Gfx inv_mushi_scroll_mode[]; + +static void mIV_set_base_frame_dl(Submenu* submenu, GAME_PLAY* play, GRAPH* graph, int page, int scroll_flag, f32 pos_x, + f32 pos_y) { + static Gfx* base_frame[] = { inv_sakana_model, inv_mwin_model, inv_mushi_model }; + static Gfx* part_frame[] = { inv_sakana_part_model, inv_mwin_model, inv_mushi_part_model }; + static Gfx* scroll_set[] = { inv_sakana_scroll_mode, NULL, inv_mushi_scroll_mode }; + + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(pos_x, pos_y, 140.0f, 1); + + OPEN_POLY_OPA_DISP(graph); + + gSPDisplayList(POLY_OPA_DISP++, inv_mwin_mode); + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (scroll_flag) { + int tex_x; + int tex_y; + + if (page == mIV_PAGE_INVENTORY) { + gDPLoadTLUT_Dolphin(POLY_OPA_DISP++, 14, 16, 1, mSM_Get_ground_pallet_p(play)); + gDPSetTextureImage_Dolphin(POLY_OPA_DISP++, G_IM_FMT_CI, G_IM_SIZ_4b, 32, 32, mSM_Get_ground_tex_p(play)); + gDPSetTile_Dolphin(POLY_OPA_DISP++, G_DOLPHIN_TLUT_DEFAULT_MODE, G_TX_RENDERTILE, 14, GX_REPEAT, GX_REPEAT, + GX_CLAMP, GX_CLAMP); + } else { + gSPDisplayList(POLY_OPA_DISP++, scroll_set[page]); + } + + gDPTileSync(POLY_OPA_DISP++); + tex_x = (int)-submenu->overlay->menu_control.texture_pos[0] & 0x7F; + tex_y = (int)-submenu->overlay->menu_control.texture_pos[1] & 0x7F; + gDPSetTileSize(POLY_OPA_DISP++, G_TX_RENDERTILE, tex_x, tex_y, tex_x + (31 << 2), tex_y + (31 << 2)); + gSPDisplayList(POLY_OPA_DISP++, base_frame[page]); + } else { + gSPDisplayList(POLY_OPA_DISP++, part_frame[page]); + } + + CLOSE_POLY_OPA_DISP(graph); +} + +/* letter slots */ +extern Gfx inv_mwin_1aT_model[]; +extern Gfx inv_mwin_2aT_model[]; +extern Gfx inv_mwin_3aT_model[]; +extern Gfx inv_mwin_4aT_model[]; +extern Gfx inv_mwin_5aT_model[]; +extern Gfx inv_mwin_6aT_model[]; +extern Gfx inv_mwin_7aT_model[]; +extern Gfx inv_mwin_8aT_model[]; +extern Gfx inv_mwin_9aT_model[]; +extern Gfx inv_mwin_10aT_model[]; + +/* item slots */ +extern Gfx inv_mwin_1bT_model[]; +extern Gfx inv_mwin_2bT_model[]; +extern Gfx inv_mwin_3bT_model[]; +extern Gfx inv_mwin_4bT_model[]; +extern Gfx inv_mwin_5bT_model[]; +extern Gfx inv_mwin_6bT_model[]; +extern Gfx inv_mwin_7bT_model[]; +extern Gfx inv_mwin_8bT_model[]; +extern Gfx inv_mwin_9bT_model[]; +extern Gfx inv_mwin_10bT_model[]; +extern Gfx inv_mwin_11bT_model[]; +extern Gfx inv_mwin_12bT_model[]; +extern Gfx inv_mwin_13bT_model[]; +extern Gfx inv_mwin_14bT_model[]; +extern Gfx inv_mwin_15bT_model[]; + +extern Gfx inv_mwin_item_frame_mode[]; +extern Gfx inv_mwin_kuni_model[]; +extern Gfx inv_mwin_kuni2_model[]; + +static void mIV_set_normal_frame_dl(Submenu* submenu, GAME_PLAY* play, GRAPH* graph, f32 pos_x, f32 pos_y) { + static Gfx* item_frame_disp[] = { + inv_mwin_1bT_model, inv_mwin_2bT_model, inv_mwin_3bT_model, inv_mwin_4bT_model, inv_mwin_5bT_model, + inv_mwin_6bT_model, inv_mwin_7bT_model, inv_mwin_8bT_model, inv_mwin_9bT_model, inv_mwin_10bT_model, + inv_mwin_11bT_model, inv_mwin_12bT_model, inv_mwin_13bT_model, inv_mwin_14bT_model, inv_mwin_15bT_model, + }; + + static Gfx* letter_frame_disp[] = { + inv_mwin_1aT_model, inv_mwin_2aT_model, inv_mwin_3aT_model, inv_mwin_4aT_model, inv_mwin_5aT_model, + inv_mwin_6aT_model, inv_mwin_7aT_model, inv_mwin_8aT_model, inv_mwin_9aT_model, inv_mwin_10aT_model, + }; + + Gfx** frame_p; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int i; + + mIV_set_base_frame_dl(submenu, play, graph, mIV_PAGE_INVENTORY, TRUE, pos_x, pos_y); + + OPEN_POLY_OPA_DISP(graph); + + gSPDisplayList(POLY_OPA_DISP++, inv_mwin_item_frame_mode); + + frame_p = item_frame_disp; + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + gDPPipeSync(POLY_OPA_DISP++); + + if ((inv_ovl->selectable_item_bitfield & (1 << i)) != 0) { + gDPSetEnvColor(POLY_OPA_DISP++, 100, 100, 255, 255); + } else { + gDPSetEnvColor(POLY_OPA_DISP++, 120, 140, 255, 255); + } + + gSPDisplayList(POLY_OPA_DISP++, *frame_p); + frame_p++; + } + + frame_p = letter_frame_disp; + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + gDPPipeSync(POLY_OPA_DISP++); + + if ((inv_ovl->selectable_mail_bitfield & (1 << i)) != 0) { + gDPSetEnvColor(POLY_OPA_DISP++, 255, 60, 60, 255); + } else { + gDPSetEnvColor(POLY_OPA_DISP++, 255, 90, 90, 255); + } + + gSPDisplayList(POLY_OPA_DISP++, *frame_p); + frame_p++; + } + + gSPDisplayList(POLY_OPA_DISP++, inv_mwin_kuni_model); + gSPDisplayList(POLY_OPA_DISP++, inv_mwin_kuni2_model); + + CLOSE_POLY_OPA_DISP(graph); +} + +static int mIV_is_mark_check(mIV_Ovl_c* inv_ovl, int idx) { + if ((inv_ovl->item_mark_bitfield & (1 << idx)) != 0) { + return TRUE; + } + + return FALSE; +} + +extern Gfx inv_item_mode[]; + +static void mIV_set_item(Submenu* submenu, mSM_MenuInfo_c* menu_info, GRAPH* graph, f32 pos_x, f32 pos_y) { + mTG_Ovl_c* tag_ovl; + mTG_tag_c* tag; + mIV_Ovl_c* inv_ovl; + mActor_name_t* item; + u8* scale_type; + int i; + int anim_frame; + f32 hand_pos[2]; + f32 scale; + int no_wc_flag; + + tag = &submenu->overlay->tag_ovl->tags[0]; + inv_ovl = submenu->overlay->inventory_ovl; + item = Now_Private->inventory.pockets; + scale_type = inv_ovl->item_scale_type; + + OPEN_POLY_OPA_DISP(graph); + + gSPDisplayList(POLY_OPA_DISP++, inv_item_mode); + + CLOSE_POLY_OPA_DISP(graph); + + no_wc_flag = inv_ovl->wc_flag; + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++, item++, scale_type++) { + if (*item != EMPTY_NO) { + submenu->overlay->tag_ovl->set_hand_pos_proc(submenu, hand_pos, mTG_TABLE_ITEM, i); + if (tag->table == mTG_TABLE_ITEM) { + switch (*scale_type) { + case mIV_ITEM_SCALE_TYPE_PRESENT: { + scale = 1.0f; + + /* @fakematch -- why do I have to set this twice? */ + if (inv_ovl->remove_timer != 0) { + anim_frame = 48 - inv_ovl->remove_timer; + } else { + anim_frame = 0; + } + + anim_frame = (inv_ovl->remove_timer != 0 ? 48 - inv_ovl->remove_timer : 0); + break; + } + + case mIV_ITEM_SCALE_TYPE_NONE: { + scale = 1.0f; + anim_frame = 0; + break; + } + + case mIV_ITEM_SCALE_TYPE_SHRINK: { + anim_frame = 70 - inv_ovl->remove_timer; + scale = (f32)inv_ovl->remove_timer * (1.0f / 12.0f); + + if (anim_frame >= 6) { + anim_frame = 5; + } + break; + } + + default: { + anim_frame = 0; + scale = + 1.0f - (f32)(inv_ovl->remove_timer - 14 - (*scale_type - mIV_ITEM_SCALE_TYPE_GROW) * 14) * + (1.0f / 12.0f); + break; + } + } + + if (scale > 1.0f) { + scale = 1.0f; + } else if (scale < 0.0f) { + scale = 0.0f; + } + } else { + anim_frame = 0; + scale = 1.0f; + } + + /* @BUG - they compare int (anim_frame) to float (0.0f) here instead of just 0 */ + if (*scale_type == mIV_ITEM_SCALE_TYPE_PRESENT && anim_frame != 0.0f) { + submenu->overlay->draw_item_proc(graph, pos_x + hand_pos[0], pos_y + hand_pos[1], scale, *item, FALSE, + (inv_ovl->selectable_item_bitfield & (1 << i)), 0, FALSE, FALSE); + } + + submenu->overlay->draw_item_proc( + graph, pos_x + hand_pos[0], pos_y + hand_pos[1], scale, *item, + ((Now_Private->inventory.item_conditions >> (i * 2)) & mPr_ITEM_COND_PRESENT) != 0, + !no_wc_flag && (inv_ovl->selectable_item_bitfield & (1 << i)), anim_frame, FALSE, + mIV_is_mark_check(inv_ovl, i)); + } + } +} + +static void mIV_set_mail(Submenu* submenu, mSM_MenuInfo_c* menu_info, GRAPH* graph, f32 pos_x, f32 pos_y) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + Mail_c* mail = Now_Private->mail; + mTG_tag_c* tag = &tag_ovl->tags[0]; + u16 select_mask = 0; + f32 scale; + f32 pos[2]; + int i; + int menu_flag; + int mark_flag; + + if (inv_ovl->remove_timer > 0 && (tag->table == mTG_TABLE_MAIL || inv_ovl->_5E4 == 1)) { + if (inv_ovl->_5E4 == 1) { + select_mask = inv_ovl->_5E2; + } else if (inv_ovl->_5E4 == 0) { + select_mask = 1 << tag_ovl->get_table_idx_proc(tag); + } + } + + OPEN_POLY_OPA_DISP(graph); + + gSPDisplayList(POLY_OPA_DISP++, inv_item_mode); + + CLOSE_POLY_OPA_DISP(graph); + + if (menu_info->data0 == mSM_IV_OPEN_CPMAIL) { + pos_x -= -155.0f; + } + + menu_flag = TRUE; + if (menu_info->next_menu_type == mSM_OVL_NEEDLEWORK) { + menu_flag = FALSE; + } + + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++, mail++) { + if ((inv_ovl->mail_mark_bitfield & (1 << i)) == 0 && mMl_check_not_used_mail(mail) != TRUE) { + if ((select_mask & (1 << i)) != 0) { + scale = (f32)inv_ovl->remove_timer * (1.0f / 24.0f); + } else { + scale = 1.0f; + } + + if ((inv_ovl->_5E2 & (1 << i)) != 0 && inv_ovl->_5E4 == 0) { + mark_flag = TRUE; + } else { + mark_flag = FALSE; + } + + submenu->overlay->tag_ovl->set_hand_pos_proc(submenu, pos, mTG_TABLE_MAIL, i); + + submenu->overlay->draw_mail_proc(graph, pos_x + pos[0], pos_y + pos[1], scale, mail, + menu_flag && (inv_ovl->selectable_mail_bitfield & (1 << i)), FALSE, + mark_flag); + } + } +} + +static void mIV_set_money(Submenu* submenu, GAME* game, f32 pos_x, f32 pos_y) { + u8 money_str[6]; + f32 width; + + mFont_UnintToString(money_str, sizeof(money_str), submenu->overlay->inventory_ovl->disp_money, + sizeof(money_str) - 1, FALSE, FALSE, TRUE); + + width = (f32)mFont_GetStringWidth(money_str, sizeof(money_str), TRUE) * 0.875f; + pos_x = (160.0f + pos_x + -22.0f + 38.5f) - width; + pos_y = 120.0f - (pos_y + 18.0f); + + // clang-format off + mFont_SetLineStrings( + game, + money_str, sizeof(money_str), + pos_x, pos_y, + 255, 60, 0, 255, + FALSE, + TRUE, + 0.875f, 0.875f, + mFont_MODE_POLY + ); + // clang-format on +} + +typedef struct inventory_line_data_s { + int max_str_len; + f32 pos_x; + f32 pos_y; + f32 scale; + rgba_t color; + f32 max_width; +} mIV_line_data_c; + +static void mIV_SetLineStrings_centering(GAME* game, u8* string, int type, f32 x, f32 y) { + // clang-format off + static mIV_line_data_c line_data[] = { + { + 8, + 105.0f, 52.0f, + 0.875f, + { 60, 80, 110, 255 }, + 90.0f + }, + + { + 8, + 111.0f, 64.0f, + 0.9375f, + { 70, 70, 100, 255 }, + 90.0f + }, + }; + // clang format on + + mIV_line_data_c* line_data_p = &line_data[type]; + f32 scale = line_data_p->scale; + int len = mMl_strlen(string, line_data_p->max_str_len, CHAR_SPACE); + f32 width = (f32)mFont_GetStringWidth(string, len, TRUE) * scale; + f32 max_width = line_data_p->max_width; + + if (width > max_width) { + width = max_width; + } + + x += (max_width - width) * 0.5f; + + // clang-format off + mFont_SetLineStrings( + game, + string, line_data_p->max_str_len, + x + line_data_p->pos_x, -y + line_data_p->pos_y, + line_data_p->color.r, line_data_p->color.g, line_data_p->color.b, line_data_p->color.a, + FALSE, + TRUE, + scale, scale, + mFont_MODE_POLY + ); + // clang-format on +} + +static f32 mIV_get_win_posY(Submenu* submenu, mSM_MenuInfo_c* menu_info, int page) { + if (page == submenu->overlay->inventory_ovl->next_page_id) { + return menu_info->position[1]; + } else { + return -menu_info->position[1]; + } +} + +static int mIV_up_page_draw_check(Submenu* submenu, int page) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + if (inv_ovl->page_move_timer > 20) { + if (inv_ovl->next_page_id == page || inv_ovl->page_order[0] == page) { + return TRUE; + } + } else if (inv_ovl->page_move_timer != 0) { + if (inv_ovl->page_order[2] != page) { + return TRUE; + } + } else if (inv_ovl->page_order[0] == page) { + return TRUE; + } + + return FALSE; +} + +static void mIV_set_collect_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game, int page) { + GRAPH* graph = game->graph; + mActor_name_t item; + int i; + f32 pos_x; + f32 pos_y; + int flag; + f32 pos[2]; + + if (menu_info->data0 == mSM_IV_OPEN_CPMAIL) { + pos_x = menu_info->position[0] + -155.0f; + } else { + pos_x = menu_info->position[0]; + } + + pos_y = mIV_get_win_posY(submenu, menu_info, page); + + if (menu_info->data0 == mSM_IV_OPEN_NORMAL && mIV_up_page_draw_check(submenu, page)) { + flag = TRUE; + } else { + flag = FALSE; + } + + mIV_set_base_frame_dl(submenu, (GAME_PLAY*)game, graph, page, flag, pos_x, pos_y); + if (flag) { + OPEN_POLY_OPA_DISP(graph); + + gSPDisplayList(POLY_OPA_DISP++, inv_item_mode); + + CLOSE_POLY_OPA_DISP(graph); + + for (i = 0; i < mIV_COLLECT_NUM; i++) { + item = mIV_set_collect_itemNo(i, page); + + if (item != EMPTY_NO) { + submenu->overlay->tag_ovl->set_hand_pos_proc(submenu, pos, mTG_TABLE_COLLECT, i); + submenu->overlay->draw_item_proc(graph, pos_x + pos[0], pos_y + pos[1], 1.0f, item, FALSE, TRUE, 1, + FALSE, FALSE); + } + } + } +} + +static void mIV_set_normal_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game) { + GRAPH* graph = game->graph; + f32 pos_x; + f32 pos_y; + + if (menu_info->data0 == mSM_IV_OPEN_CPMAIL) { + pos_x = menu_info->position[0] + -155.0f; + } else { + pos_x = menu_info->position[0]; + } + + pos_y = mIV_get_win_posY(submenu, menu_info, mIV_PAGE_INVENTORY); + mIV_set_normal_frame_dl(submenu, (GAME_PLAY*)game, graph, pos_x, pos_y); + + if (mIV_up_page_draw_check(submenu, mIV_PAGE_INVENTORY)) { + mIV_set_item(submenu, menu_info, graph, pos_x, pos_y); + mIV_set_mail(submenu, menu_info, graph, pos_x, pos_y); + + Matrix_push(); + mIV_set_player(submenu, graph, (GAME_PLAY*)game, pos_x, pos_y); + Matrix_pull(); + + submenu->overlay->set_char_matrix_proc(graph); + mIV_SetLineStrings_centering(game, Now_Private->player_ID.land_name, mIV_STRING_LAND_NAME, pos_x, pos_y); + mIV_SetLineStrings_centering(game, Now_Private->player_ID.player_name, mIV_STRING_PLAYER_NAME, pos_x, pos_y); + mIV_set_money(submenu, game, pos_x, pos_y); + } +} + +static void mIV_set_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + u8* page_order = inv_ovl->page_order; + int i; + + for (i = mIV_PAGE_INSECT_COLLECTION; i >= 0; i--) { + if (page_order[i] == mIV_PAGE_INVENTORY) { + mIV_set_normal_dl(submenu, menu_info, game); + } else { + mIV_set_collect_dl(submenu, menu_info, game, page_order[i]); + } + } + + submenu->overlay->menu_control.tag_draw_func(submenu, game, mSM_OVL_INVENTORY); +} + +static void mIV_inventory_ovl_draw(Submenu* submenu, GAME* game) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_INVENTORY]; + + menu_info->pre_draw_func(submenu, game); + mIV_set_dl(submenu, menu_info, game); +} + +extern void mIV_inventory_ovl_set_proc(Submenu* submenu) { + Submenu_Overlay_c* overlay = submenu->overlay; + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_INVENTORY]; + + overlay->menu_control.menu_move_func = &mIV_inventory_ovl_move; + overlay->menu_control.menu_draw_func = &mIV_inventory_ovl_draw; + + if (overlay->hand_ovl != NULL && menu_info->next_proc_status != mSM_OVL_PROC_END) { + submenu->overlay->hand_ovl->set_hand_func(submenu); + } +} + +static void mIV_inventory_ovl_init(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME_PLAY* play) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + PLAYER_ACTOR* player = GET_PLAYER_ACTOR(play); + mActor_name_t dig_item = EMPTY_NO; + int i; + Mail_c* mail = Now_Private->mail; + + menu_info->proc_status = mSM_OVL_PROC_MOVE; + menu_info->move_drt = mSM_MOVE_IN_RIGHT; + i = 0; + + switch (menu_info->data0) { + case mSM_IV_OPEN_HANIWA_TAKE: { + inv_ovl->selectable_item_bitfield = 0; + inv_ovl->selectable_mail_bitfield = 0; + break; + } + + case mSM_IV_OPEN_QUEST: { + inv_ovl->selectable_item_bitfield |= 1 << menu_info->data1; + inv_ovl->selectable_mail_bitfield = 0; + break; + } + + case mSM_IV_OPEN_16: { + inv_ovl->selectable_item_bitfield = menu_info->data1; + inv_ovl->selectable_mail_bitfield = 0; + break; + } + + case mSM_IV_OPEN_SEND_MAIL: { + inv_ovl->selectable_item_bitfield = 0; + inv_ovl->selectable_mail_bitfield = 0; + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + if (mMl_check_not_used_mail(mail) == FALSE && mMl_check_send_mail(mail)) { + inv_ovl->selectable_mail_bitfield |= 1 << i; + } + + mail++; + } + break; + } + + case mSM_IV_OPEN_MAILBOX: { + inv_ovl->selectable_mail_bitfield = 0xFFFF; + inv_ovl->selectable_item_bitfield = 0; + break; + } + + case mSM_IV_OPEN_CPMAIL: { + inv_ovl->selectable_item_bitfield = 0; + inv_ovl->selectable_mail_bitfield = 0; + for (i; i < mPr_INVENTORY_MAIL_COUNT; i++) { + if (mMl_check_not_used_mail(mail) || mMl_check_send_mail(mail) == FALSE) { + inv_ovl->selectable_mail_bitfield |= 1 << i; + } + + mail++; + } + + menu_info->move_drt = mSM_MOVE_IN_LEFT; + break; + } + + default: { + inv_ovl->selectable_item_bitfield = mSM_check_open_inventory_itemlist(menu_info->data0, menu_info->data1); + + if (menu_info->data0 == mSM_IV_OPEN_NORMAL || menu_info->data0 == mSM_IV_OPEN_EXCHANGE) { + inv_ovl->selectable_mail_bitfield = 0xFFFF; + } else { + inv_ovl->selectable_mail_bitfield = 0; + } + break; + } + } + + menu_info->next_proc_status = mSM_OVL_PROC_OBEY; + + if (menu_info->data0 == mSM_IV_OPEN_CPMAIL) { + mSM_open_submenu(submenu, mSM_OVL_CPMAIL, 0, 0); + } else if (menu_info->data0 == mSM_IV_OPEN_MAILBOX) { + mSM_open_submenu(submenu, mSM_OVL_MAILBOX, 0, 0); + } else if (menu_info->data0 == mSM_IV_OPEN_HANIWA_ENTRUST) { + mSM_open_submenu(submenu, mSM_OVL_HANIWA, mSM_HANIWA_OPEN_ENTRUST, menu_info->data1); + } else if (menu_info->data0 == mSM_IV_OPEN_HANIWA_TAKE) { + mSM_open_submenu(submenu, mSM_OVL_HANIWA, mSM_HANIWA_OPEN_TAKE, menu_info->data1); + } else { + menu_info->next_proc_status = mSM_OVL_PROC_PLAY; + } + + inv_ovl->disp_money = Now_Private->inventory.wallet; + + if (menu_info->data0 == mSM_IV_OPEN_EXCHANGE && ITEM_NAME_GET_TYPE(menu_info->data1) == NAME_TYPE_ITEM1 && + ITEM_NAME_GET_CAT(menu_info->data1) == ITEM1_CAT_FISH) { + inv_ovl->release_flag = TRUE; + } else { + inv_ovl->release_flag = mCoBG_SearchWaterLimitDistN(&inv_ovl->release_pos, player->actor_class.world.position, + player->actor_class.shape_info.rotation.y, 120.0f, 12); + } + + if (mPlib_Check_scoop_after((GAME*)play, &inv_ovl->shovel_pos, &dig_item, NULL, FALSE) == + mPlayer_INDEX_FILL_SCOOP) { + inv_ovl->shovel_flag = TRUE; + } else { + inv_ovl->shovel_flag = FALSE; + } + + inv_ovl->page_order[0] = mIV_PAGE_INVENTORY; + inv_ovl->page_order[1] = mIV_PAGE_FISH_COLLECTION; + inv_ovl->page_order[2] = mIV_PAGE_INSECT_COLLECTION; + inv_ovl->page_move_timer = 0; + inv_ovl->_5E4 = 0; + inv_ovl->item_mark_bitfield = 0; + inv_ovl->_5E2 = 0; + inv_ovl->wc_flag = FALSE; + + if (menu_info->data0 == mSM_IV_OPEN_MAILBOX) { + sAdo_SysTrgStart(SE_FLAG_15(NA_SE_ZOOMUP)); + } else { + sAdo_SysTrgStart(NA_SE_MENU_PAUSE); + } + + mBGMPsComp_pause(mBGM_PAUSE_1); +} + +extern void mIV_inventory_ovl_construct(Submenu* submenu) { + mSM_MenuInfo_c* menu_info = &submenu->overlay->menu_info[mSM_OVL_INVENTORY]; + GAME_PLAY* play = (GAME_PLAY*)gamePT; + mIV_Ovl_c** inv_ovl_p = &submenu->overlay->inventory_ovl; + + if (*inv_ovl_p == NULL) { + mem_clear((u8*)&inv_ovl_data, sizeof(mIV_Ovl_c), 0); + *inv_ovl_p = &inv_ovl_data; + mIV_pl_shape_init(submenu); + mIV_pl_shape_move(submenu); + mQst_ClearGrabItemInfo(); + } + + mIV_inventory_ovl_init(submenu, menu_info, play); + mIV_inventory_ovl_set_proc(submenu); + submenu->overlay->inventory_ovl->set_collect_itemNo_proc = &mIV_set_collect_itemNo; +} + +extern void mIV_inventory_ovl_destruct(Submenu* submenu) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + cKF_SkeletonInfo_R_dt(&inv_ovl->player_main_keyframe); + cKF_SkeletonInfo_R_dt(&inv_ovl->player_com_keyframe); + cKF_SkeletonInfo_R_dt(&inv_ovl->item_keyframe); + submenu->overlay->inventory_ovl = NULL; } diff --git a/src/m_submenu_ovl.c b/src/m_submenu_ovl.c index 2b5c00ef..f8d2bf91 100644 --- a/src/m_submenu_ovl.c +++ b/src/m_submenu_ovl.c @@ -2125,7 +2125,7 @@ static void mSM_set_new_start_data(Submenu* submenu) { menu->data3 = submenu->param3; menu->move_flag = FALSE; - if (type == mSM_OVL_INVENTORY && submenu->param0 == mSM_IV_OPEN_14) { + if (type == mSM_OVL_INVENTORY && submenu->param0 == mSM_IV_OPEN_CPMAIL) { menu->position[0] = -300.0f; } @@ -2235,7 +2235,7 @@ static void mSM_return_func(Submenu* submenu, mSM_MenuInfo_c* menu_info) { } } - menu_info->_2C = FALSE; + menu_info->open_flag = FALSE; menu_info->pre_menu_type = mSM_OVL_NONE; menu_info->next_menu_type = mSM_OVL_NONE; menu_info->proc_status = mSM_OVL_PROC_MOVE; From 8897596c878a50c6b1b32ff9c89093821ed2089e Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Fri, 24 May 2024 14:21:13 -0400 Subject: [PATCH 4/8] Tag Ovl work --- include/m_catalog_ovl.h | 1 + include/m_cpmail_ovl.h | 20 + include/m_cpmail_ovl_h.h | 2 + include/m_cporiginal_ovl.h | 29 + include/m_cporiginal_ovl_h.h | 16 + include/m_mail.h | 97 +- include/m_needlework_ovl.h | 1 + include/m_submenu_ovl.h | 8 +- include/m_tag_ovl.h | 28 +- src/m_board_ovl.c | 3 +- src/m_catalog_ovl.c | 2 +- src/m_tag_ovl.c | 2230 ++++++++++++++++++++++++++++++++++ src/save_check.c_inc | 765 ++++++------ 13 files changed, 2757 insertions(+), 445 deletions(-) create mode 100644 include/m_cporiginal_ovl_h.h create mode 100644 src/m_tag_ovl.c diff --git a/include/m_catalog_ovl.h b/include/m_catalog_ovl.h index ad6c5916..8fe1d175 100644 --- a/include/m_catalog_ovl.h +++ b/include/m_catalog_ovl.h @@ -14,6 +14,7 @@ extern "C" { #define mCL_MENU_ITEM_MAX 742 #define mCL_MENU_PAGE_SIZE 7 #define mCL_ITEM_DATA_NUM 2 +#define mCL_TAG_STR_SIZE 10 enum { mCL_MENU_FTR, diff --git a/include/m_cpmail_ovl.h b/include/m_cpmail_ovl.h index da1ca72f..f6c0b3a6 100644 --- a/include/m_cpmail_ovl.h +++ b/include/m_cpmail_ovl.h @@ -2,11 +2,31 @@ #define M_CPMAIL_OVL_H #include "types.h" +#include "m_cpmail_ovl_h.h" +#include "m_submenu.h" #ifdef __cplusplus extern "C" { #endif +#define mCM_PAGE_COUNT 8 +#define mCM_MAIL_COUNT 20 +#define mCM_FOLDER_NAME_LEN 12 + +/* 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; + Mail_c player_mail[mPr_INVENTORY_MAIL_COUNT]; + u8 page_order[mCM_PAGE_COUNT]; + u8 _BB0[0xBC4 - 0xBB0]; +}; + extern void mCM_cpmail_ovl_construct(Submenu* submenu); extern void mCM_cpmail_ovl_destruct(Submenu* submenu); extern void mCM_cpmail_ovl_set_proc(Submenu* submenu); diff --git a/include/m_cpmail_ovl_h.h b/include/m_cpmail_ovl_h.h index 0249784d..6b84238d 100644 --- a/include/m_cpmail_ovl_h.h +++ b/include/m_cpmail_ovl_h.h @@ -7,6 +7,8 @@ extern "C" { #endif +typedef struct cpmail_ovl_s mCM_Ovl_c; + #ifdef __cplusplus } #endif diff --git a/include/m_cporiginal_ovl.h b/include/m_cporiginal_ovl.h index 5a5b1fe7..c225c9e5 100644 --- a/include/m_cporiginal_ovl.h +++ b/include/m_cporiginal_ovl.h @@ -2,14 +2,43 @@ #define M_CPORIGINAL_OVL_H #include "types.h" +#include "m_cporiginal_ovl_h.h" #include "m_submenu_ovl.h" #ifdef __cplusplus extern "C" { #endif +#define mCO_PAGE_NUM 8 +#define mCO_ORIGINAL_NUM 12 +#define mCO_FOLDER_NAME_LEN 12 + +/* 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; + +struct cporiginal_s { + mCD_original_c* card_original; + u8 page_order[mCO_PAGE_NUM]; + u8 up_folder; + u8 chang_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]; +}; + extern void mCO_swap_image(Submenu* submenu, mActor_name_t item0, mActor_name_t item1); 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); extern int mCO_check_hide_flg(Submenu* submenu, int folder, int idx); extern void mCO_on_hide_flg(Submenu* submenu, int folder, int idx); extern void mCO_clear_hide_flg(Submenu* submenu); diff --git a/include/m_cporiginal_ovl_h.h b/include/m_cporiginal_ovl_h.h new file mode 100644 index 00000000..52a62918 --- /dev/null +++ b/include/m_cporiginal_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_CPORIGINAL_H_H +#define M_CPORIGINAL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct cporiginal_s mCO_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_mail.h b/include/m_mail.h index 0ded70ac..8c5b95a6 100644 --- a/include/m_mail.h +++ b/include/m_mail.h @@ -22,82 +22,84 @@ extern "C" { #define mMl_MUSEUM_INFO_MAIL_NO 189 // TODO: enum? enum { - mMl_NAME_TYPE_PLAYER, - mMl_NAME_TYPE_NPC, - mMl_NAME_TYPE_MUSEUM, + mMl_NAME_TYPE_PLAYER, + mMl_NAME_TYPE_NPC, + mMl_NAME_TYPE_MUSEUM, - mMl_NAME_TYPE_NUM, - mMl_NAME_TYPE_CLEAR = 0xFF + mMl_NAME_TYPE_NUM, + mMl_NAME_TYPE_CLEAR = 0xFF }; enum { - mMl_FONT_0, - mMl_FONT_SEND, - mMl_FONT_2, - mMl_FONT_3, - mMl_FONT_4, + mMl_FONT_0, + mMl_FONT_SEND, + mMl_FONT_2, + mMl_FONT_3, + mMl_FONT_4, - mMl_FONT_NUM + mMl_FONT_NUM }; enum { - mMl_DATA, - mMl_DATA2, + mMl_DATA, + mMl_DATA2, - mMl_DATA_NUM + mMl_DATA_NUM }; enum { - mMl_TYPE_MAIL = 0, - mMl_TYPE_XMAS = 1, - mMl_TYPE_SHOP_SALE_LEAFLET = 2, - mMl_TYPE_BROKER_SALE_LEAFLET = 3, - mMl_TYPE_4 = 4, - mMl_TYPE_5 = 5, - mMl_TYPE_HRA = 6, + mMl_TYPE_MAIL, + mMl_TYPE_XMAS, + mMl_TYPE_SHOP_SALE_LEAFLET, + mMl_TYPE_BROKER_SALE_LEAFLET, + mMl_TYPE_MOTHER, + mMl_TYPE_OMIKUJI, + mMl_TYPE_HRA, + mMl_TYPE_SHOP, + mMl_TYPE_SNOWMAN, + mMl_TYPE_FISHING_CONTENST, + mMl_TYPE_POSTOFFICE, + mMl_TYPE_SPNPC_PASSWORD, - mMl_TYPE_FISHING_CONTENST = 9, - - mMl_TYPE_SPNPC_PASSWORD = 11, - mMl_TYPE_12 = 12 + mMl_TYPE_NUM }; /* sizeof(Mail_nm_c) == 0x16 */ typedef struct mail_nm_s { - /* 0x00 */ PersonalID_c personalID; - /* 0x14 */ u8 type; + /* 0x00 */ PersonalID_c personalID; + /* 0x14 */ u8 type; } Mail_nm_c; /* sizeof(mail_header_save_s) == 0x3A */ typedef struct mail_header_save_s { - /* 0x00 */ s8 header_back_start; - /* 0x01 */ u8 unknown; - /* 0x02 */ u8 header[MAIL_HEADER_LEN]; - /* 0x1A */ u8 footer[MAIL_FOOTER_LEN]; + /* 0x00 */ s8 header_back_start; + /* 0x01 */ u8 unknown; + /* 0x02 */ u8 header[MAIL_HEADER_LEN]; + /* 0x1A */ u8 footer[MAIL_FOOTER_LEN]; } Mail_hs_c; /* sizeof(Mail_hdr_c) == 0x2C */ typedef struct mail_header_s { - /* 0x00 */ Mail_nm_c recipient; - /* 0x16 */ Mail_nm_c sender; + /* 0x00 */ Mail_nm_c recipient; + /* 0x16 */ Mail_nm_c sender; } Mail_hdr_c; /* sizeof(Mail_ct_c) == 0xFC */ typedef struct mail_content_s { - /* 0x00 */ u8 font; - /* 0x01 */ u8 header_back_start; - /* 0x02 */ u8 mail_type; - /* 0x03 */ u8 paper_type; - /* 0x04 */ u8 header[MAIL_HEADER_LEN]; - /* 0x1C */ u8 body[MAIL_BODY_LEN]; - /* 0xDC */ u8 footer[MAIL_FOOTER_LEN]; + /* 0x00 */ u8 font; + /* 0x01 */ u8 header_back_start; + /* 0x02 */ u8 mail_type; + /* 0x03 */ u8 paper_type; + /* 0x04 */ u8 header[MAIL_HEADER_LEN]; + /* 0x1C */ u8 body[MAIL_BODY_LEN]; + /* 0xDC */ u8 footer[MAIL_FOOTER_LEN]; } Mail_ct_c; /* sizeof(Mail_c) == 0x12A */ typedef struct mail_s { - /* 0x000 */ Mail_hdr_c header; - /* 0x02C */ mActor_name_t present; - /* 0x02E */ Mail_ct_c content; + /* 0x000 */ Mail_hdr_c header; + /* 0x02C */ mActor_name_t present; + /* 0x02E */ Mail_ct_c content; } Mail_c; extern int mMl_strlen(u8* str, int size, u8 end_char); @@ -119,9 +121,12 @@ extern int mMl_get_npcinfo_from_mail_name(AnmPersonalID_c* anm_pid, Mail_nm_c* n extern int mMl_hunt_for_send_address(Mail_c* mail); extern int mMl_check_send_mail(Mail_c* mail); extern int mMl_check_set_present_myself(Mail_c* mail); -extern int mMl_send_mail_box(PersonalID_c* recipient_pid, int player_no, Mail_c* mail, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type); -extern int mMl_send_mail_postoffice(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type); -extern int mMl_send_mail(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type); +extern int mMl_send_mail_box(PersonalID_c* recipient_pid, int player_no, Mail_c* mail, mActor_name_t present, + mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type); +extern int mMl_send_mail_postoffice(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, + mActor_name_t paper, int mail_no, u8* sender_name, u32 proc_type, u8 mail_type); +extern int mMl_send_mail(PersonalID_c* recipient_pid, int player_no, mActor_name_t present, mActor_name_t paper, + int mail_no, u8* sender_name, u32 proc_type); extern void mMl_start_send_mail(); #ifdef __cplusplus diff --git a/include/m_needlework_ovl.h b/include/m_needlework_ovl.h index e33f6f16..4c5076a8 100644 --- a/include/m_needlework_ovl.h +++ b/include/m_needlework_ovl.h @@ -9,6 +9,7 @@ extern "C" { #endif extern u8 mNW_get_image_no(Submenu* submenu, int slot_no); +extern u8* mNW_get_image_name(Submenu* submenu, int idx); extern int mNW_check_hide_flg(Submenu* submenu, int idx); extern void mNW_on_hide_flg(Submenu* submenu, int idx); extern void mNW_clear_hide_flg(Submenu* submenu); diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index d53e7006..4227bbfa 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -29,6 +29,8 @@ #include "m_hand_ovl_h.h" #include "m_inventory_ovl_h.h" #include "m_player.h" +#include "m_cpmail_ovl_h.h" +#include "m_cporiginal_ovl_h.h" #ifdef __cplusplus extern "C" { @@ -183,14 +185,14 @@ struct submenu_overlay_s { /* 0x9B4 */ mMP_Overlay_c* map_ovl; /* 0x9B8 */ mNT_Ovl_c* notice_ovl; /* 0x9BC */ mBR_Ovl_c* birthday_ovl; - /* 0x9C0 */ void* _9C0; + /* 0x9C0 */ mCM_Ovl_c* cpmail_ovl; /* 0x9C4 */ void* _9C4; /* 0x9C8 */ void* _9C8; /* 0x9CC */ mCL_Ovl_c* catalog_ovl; /* 0x9D0 */ mMU_Overlay_c* music_ovl; /* 0x9D4 */ mBN_Overlay_c* bank_ovl; - /* 0x9D8 */ void* _9D8; - /* 0x9DC */ void* _9DC; + /* 0x9D8 */ void* needlework_ovl; + /* 0x9DC */ mCO_Ovl_c* cporiginal_ovl; /* 0x9E0 */ void* _9E0; /* 0x9E4 */ void* _9E4; /* 0x9E8 */ mDI_Ovl_c* diary_ovl; diff --git a/include/m_tag_ovl.h b/include/m_tag_ovl.h index d44cbd8e..068437f0 100644 --- a/include/m_tag_ovl.h +++ b/include/m_tag_ovl.h @@ -10,6 +10,10 @@ extern "C" { #endif #define mTG_TAG_NUM 4 +#define mTG_TAG_STR_LEN 16 +#define mTG_TAG_SEL_STRING_LEN 35 + +#define mTG_TAG_FLAG_EDGE_FOOT_SELECT (1 << 0) enum { mTG_TYPE_NONE, @@ -129,16 +133,24 @@ enum { /* sizeof(mTG_tag_c) == 0xB4 */ typedef struct tag_s { u8 type; - u8 _01; - u8 _02; - u8 _03; + u8 arrow_dir; + u8 str2_type; + u8 flags; f32 _04[2]; - f32 pos[2]; - u8 _14[0x38 - 0x14]; + f32 base_pos[2]; + f32 body_scale[2]; + f32 arrow_scale[2]; + f32 body_ofs[2]; + f32 text_ofs[2]; + f32 _34; int table; - int _3C; - int _40; - u8 _44[0xB4 - 0x44]; + int tag_col; + int tag_row; + f32 scale; + u8 str0[mTG_TAG_SEL_STRING_LEN]; + u8 str1[mTG_TAG_SEL_STRING_LEN]; + u8 str2[mTG_TAG_SEL_STRING_LEN]; + u8 _B1[0xB4 - 0xB1]; } mTG_tag_c; typedef void (*mTG_INIT_TAG_DATA_ITEM_WIN_PROC)(Submenu*); diff --git a/src/m_board_ovl.c b/src/m_board_ovl.c index 4d9844e0..231228f7 100644 --- a/src/m_board_ovl.c +++ b/src/m_board_ovl.c @@ -1196,7 +1196,8 @@ static void mBD_set_writing_header(Submenu* submenu, GAME* game, mSM_MenuInfo_c* mem_copy(tmp_header, mail_content->header, board_ovl->lengths[mBD_FIELD_HEADER]); len = board_ovl->lengths[mBD_FIELD_HEADER]; } else if (mail_content->mail_type == mMl_TYPE_SHOP_SALE_LEAFLET || - mail_content->mail_type == mMl_TYPE_BROKER_SALE_LEAFLET || mail_content->mail_type == mMl_TYPE_5) { + mail_content->mail_type == mMl_TYPE_BROKER_SALE_LEAFLET || + mail_content->mail_type == mMl_TYPE_OMIKUJI) { mem_copy(tmp_header, mail_content->header, MAIL_HEADER_LEN); len = MAIL_HEADER_LEN; } else { diff --git a/src/m_catalog_ovl.c b/src/m_catalog_ovl.c index 0896ca75..a679f0a2 100644 --- a/src/m_catalog_ovl.c +++ b/src/m_catalog_ovl.c @@ -560,7 +560,7 @@ static void mCL_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { submenu->overlay->menu_control.tag_move_func(submenu, menu_info); if (catalog_ovl->change_flag) { - catalog_ovl->menu_data[catalog_ovl->page_order[0]].y_idx = submenu->overlay->tag_ovl->tags[0]._40; + catalog_ovl->menu_data[catalog_ovl->page_order[0]].y_idx = submenu->overlay->tag_ovl->tags[0].tag_row; mCL_item_data_set(submenu, catalog_ovl->page_order[0]); catalog_ovl->change_flag = FALSE; } else { diff --git a/src/m_tag_ovl.c b/src/m_tag_ovl.c new file mode 100644 index 00000000..b4b070e2 --- /dev/null +++ b/src/m_tag_ovl.c @@ -0,0 +1,2230 @@ +#include "m_tag_ovl.h" + +#include "m_common_data.h" +#include "m_inventory_ovl.h" +#include "m_hand_ovl.h" +#include "m_cpmail_ovl.h" +#include "m_cporiginal_ovl.h" +#include "m_gba_ovl.h" +#include "m_needlework_ovl.h" +#include "m_catalog_ovl.h" +#include "m_font.h" +#include "_mem.h" +#include "m_lib.h" +#include "m_item_name.h" + +static mTG_Ovl_c tag_ovl_data; + +typedef struct tag_word_s { + u8 str[mTG_TAG_STR_LEN]; + mSM_MOVE_PROC move_proc; +} mTG_tag_word_c; + +typedef struct tag_data_s { + mTG_tag_word_c* words; /* array of words for each line */ + int lines; /* # of lines */ +} mTG_tag_data_c; + +typedef struct tag_table_data_s { + s16 col_num; + s16 row_num; + s16* col_pos; + s16* row_pos; +} mTG_tag_data_table_c; + +/* columns */ +static s16 mTG_item_col_pos[] = { -77, -53, -29, -5, 19 }; +static s16 mTG_mail_col_pos[] = { 55, 79 }; +static s16 mTG_money_col_pos[] = { 19 }; +static s16 mTG_player_col_pos[] = { -59 }; +static s16 mTG_bg_col_pos[] = { 19 }; +static s16 mTG_mbox_col_pos[] = { -36, -12 }; +static s16 mTG_haniwa_col_pos[] = { -35, -11, 13, 37 }; +static s16 mTG_collect_col_pos[] = { -89, -65, -41, -17, 8, 32, 57, 81 }; +static s16 mTG_wchange_col_pos[] = { 105 }; +static s16 mTG_cpmail_col_pos[] = { -16, 8, 32, 56 }; +static s16 mTG_cpmail_wc_col_pos[] = { 98 }; +static s16 mTG_cpmail_ti_col_pos[] = { 24 }; +static s16 mTG_cpedit_col_pos[] = { 20 }; +static s16 mTG_cpedit_end_col_pos[] = { 20 }; +static s16 mTG_catalog_col_pos[] = { 65 }; +static s16 mTG_catalog_wc_col_pos[] = { 93 }; +static s16 mTG_music_main_col_pos[] = { -100, -80, -60, -40, -20, 0, 20, 40, 60, 80, 100 }; +static s16 mTG_needlework_col_pos[] = { -19, 19 }; +static s16 mTG_cporiginal_col_pos[] = { 0, 32, 64 }; +static s16 mTG_inventory_wc_org_col_pos[] = { -105 }; +static s16 mTG_cporiginal_nw_col_pos[] = { -88, -56 }; +static s16 mTG_cporiginal_wc_col_pos[] = { 102 }; +static s16 mTG_cporiginal_ti_col_pos[] = { 32 }; +static s16 mTG_gba_col_pos[] = { -97, -67, -37, -7 }; +static s16 mTG_gba_nw_col_pos[] = { 48, 80 }; +static s16 mTG_card_col_pos[] = { -45 }; +static s16 mTG_gba_nw_col_pos[] = { 48, 80 }; + +/* rows */ +static s16 mTG_item_line_pos[] = { -10, -34, -58 }; +static s16 mTG_mail_line_pos[] = { 38, 14, -10, -34, -58 }; +static s16 mTG_money_line_pos[] = { 18 }; +static s16 mTG_player_line_pos[] = { 63 }; +static s16 mTG_bg_line_pos[] = { -90 }; +static s16 mTG_mbox_line_pos[] = { 39, 15, -9, -33, -57 }; +static s16 mTG_haniwa_line_pos[] = { 46 }; +static s16 mTG_collect_line_pos[] = { 42, 18, -6, -30, -54 }; +static s16 mTG_wchange_line_pos[] = { 37, 0, -37 }; +static s16 mTG_mail_line_pos[] = { 38, 14, -10, -34, -58 }; +static s16 mTG_cpmail_wc_line_pos[] = { 50, 35, 20, 5, -10, -25, -40, -55 }; +static s16 mTG_cpmail_ti_line_pos[] = { 71 }; +static s16 mTG_cpedit_line_pos[] = { 50, 18, -14 }; +static s16 mTG_cpedit_end_line_pos[] = { -49 }; +static s16 mTG_catalog_line_pos[] = { 60, 42, 24, 6, -12, -30, -48 }; +static s16 mTG_catalog_wc_line_pos[] = { 64, 48, 32, 16, 0, -16, -32, -48, -64 }; +static s16 mTG_music_main_line_pos[] = { 25, 5, -15, -35, -55 }; +static s16 mTG_needlework_line_pos[] = { 50, 16, -18, -52 }; +static s16 mTG_cporiginal_line_pos[] = { 44, 15, -14, -43 }; +static s16 mTG_inventory_wc_org_line_pos[] = { 0 }; +static s16 mTG_cporiginal_nw_line_pos[] = { 45, 16, -13, -42 }; +static s16 mTG_cporiginal_wc_line_pos[] = { 53, 40, 24, 10, -4, -18, -34, -47 }; +static s16 mTG_cporiginal_ti_line_pos[] = { 74 }; +static s16 mTG_gba_line_pos[] = { 6, -25 }; +static s16 mTG_gba_nw_line_pos[] = { 40, 11, -18, -47 }; +static s16 mTG_card_line_pos[] = { -10 }; +static s16 mTG_gba_nw_line_pos[] = { 40, 11, -18, -47 }; + +/* Data table */ +static mTG_tag_data_table_c mTG_table_data[] = { + { 5, 3, mTG_item_col_pos, mTG_item_line_pos }, /* mTG_TABLE_ITEM */ + { 2, 5, mTG_mail_col_pos, mTG_mail_line_pos }, /* mTG_TABLE_MAIL */ + { 1, 1, mTG_money_col_pos, mTG_money_line_pos }, /* mTG_TABLE_MONEY */ + { 1, 1, mTG_player_col_pos, mTG_player_line_pos }, /* mTG_TABLE_PLAYER */ + { 1, 1, mTG_bg_col_pos, mTG_bg_line_pos }, /* mTG_TABLE_BG */ + { 2, 5, mTG_mbox_col_pos, mTG_mbox_line_pos }, /* mTG_TABLE_MBOX */ + { 4, 1, mTG_haniwa_col_pos, mTG_haniwa_line_pos }, /* mTG_TABLE_HANIWA */ + { 8, 5, mTG_collect_col_pos, mTG_collect_line_pos }, /* mTG_TABLE_COLLECT */ + { 1, 3, mTG_wchange_col_pos, mTG_wchange_line_pos }, /* mTG_TABLE_WCHANGE */ + { 4, 5, mTG_cpmail_col_pos, mTG_mail_line_pos }, /* mTG_TABLE_CPMAIL */ + { 1, 8, mTG_cpmail_wc_col_pos, mTG_cpmail_wc_line_pos }, /* mTG_TABLE_CPMAIL_WC */ + { 1, 1, mTG_cpmail_ti_col_pos, mTG_cpmail_ti_line_pos }, /* mTG_TABLE_CPMAIL_TI */ + { 1, 3, mTG_cpedit_col_pos, mTG_cpedit_line_pos }, /* mTG_TABLE_CPEDIT */ + { 1, 1, mTG_cpedit_end_col_pos, mTG_cpedit_end_line_pos }, /* mTG_TABLE_CPEDIT_END */ + { 1, 7, mTG_catalog_col_pos, mTG_catalog_line_pos }, /* mTG_TABLE_CATALOG */ + { 1, 9, mTG_catalog_wc_col_pos, mTG_catalog_wc_line_pos }, /* mTG_TABLE_CATALOG_WC */ + { 11, 5, mTG_music_main_col_pos, mTG_music_main_line_pos }, /* mTG_TABLE_MUSIC_MAIN */ + { 2, 4, mTG_needlework_col_pos, mTG_needlework_line_pos }, /* mTG_TABLE_NEEDLEWORK */ + { 3, 4, mTG_cporiginal_col_pos, mTG_cporiginal_line_pos }, /* mTG_TABLE_CPORIGINAL */ + { 1, 1, mTG_inventory_wc_org_col_pos, mTG_inventory_wc_org_line_pos }, /* mTG_TABLE_INVENTORY_WC_ORG */ + { 2, 4, mTG_cporiginal_nw_col_pos, mTG_cporiginal_nw_line_pos }, /* mTG_TABLE_CPORIGINAL_NW */ + { 1, 8, mTG_cporiginal_wc_col_pos, mTG_cporiginal_wc_line_pos }, /* mTG_TABLE_CPORIGINAL_WC */ + { 1, 1, mTG_cporiginal_ti_col_pos, mTG_cporiginal_ti_line_pos }, /* mTG_TABLE_CPORIGINAL_TI */ + { 4, 2, mTG_gba_col_pos, mTG_gba_line_pos }, /* mTG_TABLE_GBA */ + { 2, 4, mTG_gba_nw_col_pos, mTG_gba_nw_line_pos }, /* mTG_TABLE_GBA_NW */ + { 1, 1, mTG_card_col_pos, mTG_card_line_pos }, /* mTG_TABLE_CARD */ + { 2, 4, mTG_gba_nw_col_pos, mTG_gba_nw_line_pos }, /* mTG_TABLE_GBA_NW2 */ +}; + +static u8 str_omikuji[7] = "fortune"; +static u8 str_happy_room[7] = "the HRA"; +static u8 postoffice_str[15] = "the post office"; +static u8 mother_str[4] = "home"; +static u8 str_otodokemono[12] = "Delivery for"; +static u8 str_otegami[9] = "letter to"; +static u8 str_title0[5] = "to\xD3 "; +static u8 str_title1[5] = "from\xD3"; +static u8 str_title2[5] = "'s "; +static u8 str_title3[5] = "for\xD3 "; +static u8 str_title4[5] = "the\xD3 "; + +static void mTG_present_open_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_nw_select_this_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_give_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_sell_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_sell_all_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_get_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_dump_mail_mark_exe_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_mailbox_change_mail_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_cpmail_change_mail_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_dump_mail_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_dump_item_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_send_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_rewrite_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_stick_select_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_carpet_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_cover_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_putin_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_music_listen_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_music_takeout_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_plant_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_field_put_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_room_put_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_put_all_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_dump_mail_mark_conf_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_next_open_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_next_open_needlework_sel_stick_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_next_open_needlework_sel_put_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_free_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_catch_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_password_item_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_write_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_priceset_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_present_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_show_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_cancel_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_read_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_take_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_m100_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_m1000_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_m10000_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_1catch_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_order_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_bury_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_release_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_fly_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_hukubukuro_open_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_cp_data_delete_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_nw_room_put_manekin_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_nw_stk_pat_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_tag_remove_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_nw_room_put_umbrella_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_nw_st_umbrella_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_nw_st_wear_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_change_original_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_drop_proc(Submenu*, mSM_MenuInfo_c*); + +static mTG_tag_word_c mTG_tag_word_akeru = { + "Open ", + &mTG_present_open_proc, +}; + +static mTG_tag_word_c mTG_tag_word_ageru = { + "Give ", + &mTG_give_proc, +}; + +static mTG_tag_word_c mTG_tag_word_itadaku = { + "Take it ", + &mTG_get_proc, +}; + +static mTG_tag_word_c mTG_tag_word_dump_item = { + "Yes ", + &mTG_dump_item_proc, +}; + +static mTG_tag_word_c mTG_tag_word_field_sign = { + "Erect ", + &mTG_field_put_proc, +}; + +static mTG_tag_word_c mTG_tag_word_dump_mail = { + "Yes ", + &mTG_dump_mail_proc, +}; + +static mTG_tag_word_c mTG_tag_word_sell = { + "Sell ", + &mTG_sell_proc, +}; + +static mTG_tag_word_c mTG_tag_word_sell_all = { + "Sell All ", + &mTG_sell_all_proc, +}; + +static mTG_tag_word_c mTG_tag_word_okuru = { + "Send ", + &mTG_send_proc, +}; + +static mTG_tag_word_c mTG_tag_word_kakinaosu = { + "Rewrite ", + &mTG_rewrite_proc, +}; + +static mTG_tag_word_c mTG_tag_word_kabeniharu = { + "Put on Wall ", + &mTG_cover_proc, +}; + +static mTG_tag_word_c mTG_tag_word_korewoireru = { + "Put Away ", + &mTG_putin_proc, +}; + +static mTG_tag_word_c mTG_tag_word_zimenniueru = { + "Plant ", + &mTG_plant_proc, +}; + +static mTG_tag_word_c mTG_tag_word_zimennioku = { + "Drop ", + &mTG_field_put_proc, +}; + +static mTG_tag_word_c mTG_tag_word_suteru = { + "Throw Away ", + &mTG_next_open_proc, +}; + +static mTG_tag_word_c mTG_tag_word_tada = { + "Give Away ", + &mTG_free_proc, +}; + +static mTG_tag_word_c mTG_tag_word_tukamu = { + "Grab ", + &mTG_catch_proc, +}; + +static mTG_tag_word_c mTG_tag_word_tegamiwokaku = { + "Write Letter ", + &mTG_write_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nedanwotukeru = { + "Set Price ", + &mTG_priceset_proc, +}; + +static mTG_tag_word_c mTG_tag_word_present = { + "Present ", + &mTG_present_proc, +}; + +static mTG_tag_word_c mTG_tag_word_miserudake = { + "Display ", + &mTG_show_proc, +}; + +static mTG_tag_word_c mTG_tag_word_yameru = { + "Quit ", + &mTG_cancel_proc, +}; + +static mTG_tag_word_c mTG_tag_word_heyanioku = { + "Drop ", + &mTG_room_put_proc, +}; + +static mTG_tag_word_c mTG_tag_word_yukanisiku = { + "Spread on Floor ", + &mTG_carpet_proc, +}; + +static mTG_tag_word_c mTG_tag_word_yomu = { + "Read ", + &mTG_read_proc, +}; + +static mTG_tag_word_c mTG_tag_word_watasu = { + "Give ", + &mTG_take_proc, +}; + +static mTG_tag_word_c mTG_tag_word_100 = { + "100 ", + &mTG_m100_proc, +}; + +static mTG_tag_word_c mTG_tag_word_1000 = { + "1000 ", + &mTG_m1000_proc, +}; + +static mTG_tag_word_c mTG_tag_word_10000 = { + "10000 ", + &mTG_m10000_proc, +}; + +static mTG_tag_word_c mTG_tag_word_okane = { + "Price\xD3:\xD3\xD3\xD3\xD3\xD3\xD3\xD3 ", + NULL, +}; + +static mTG_tag_word_c mTG_tag_word_beru = { + "Bells ", + NULL, +}; + +static mTG_tag_word_c mTG_tag_word_osameru = { + "Give ", + &mTG_putin_proc, +}; + +static mTG_tag_word_c mTG_tag_word_zenbutukamu = { + "Grab All ", + &mTG_catch_proc, +}; + +static mTG_tag_word_c mTG_tag_word_1maitukamu = { + "Grab One ", + &mTG_1catch_proc, +}; + +static mTG_tag_word_c mTG_tag_word_1tamatukamu = { + "Grab ", + &mTG_1catch_proc, +}; + +static mTG_tag_word_c mTG_tag_word_order = { + "Order ", + &mTG_order_proc, +}; + +static mTG_tag_word_c mTG_tag_word_zimenniumeru = { + "Bury ", + &mTG_bury_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nigasu = { + "Release ", + &mTG_release_proc, +}; + +static mTG_tag_word_c mTG_tag_word_fly = { + "Let Go ", + &mTG_fly_proc, +}; + +static mTG_tag_word_c mTG_tag_word_akeru2 = { + "Open ", + &mTG_hukubukuro_open_proc, +}; + +static mTG_tag_word_c mTG_tag_word_kesu = { + "???? ", + &mTG_next_open_proc, +}; + +static mTG_tag_word_c mTG_tag_word_hai = { + "Yes ", + &mTG_cp_data_delete_proc, +}; + +static mTG_tag_word_c mTG_tag_word_iie = { + "No ", + &mTG_cancel_proc, +}; + +static mTG_tag_word_c mTG_tag_word_dump_mail_mark_conf = { + "Throw All Away ", + &mTG_dump_mail_mark_conf_proc, +}; + +static mTG_tag_word_c mTG_tag_word_dump_mail_mark_exe = { + "Yes ", + &mTG_dump_mail_mark_exe_proc, +}; + +static mTG_tag_word_c mTG_tag_word_mailbox_change_mail = { + "Copy All ", + &mTG_mailbox_change_mail_proc, +}; + +static mTG_tag_word_c mTG_tag_word_cpmail_change_mail = { + "Swap ", + &mTG_cpmail_change_mail_proc, +}; + +static mTG_tag_word_c mTG_tag_word_music_listen = { + "Listen ", + &mTG_music_listen_proc, +}; + +static mTG_tag_word_c mTG_tag_word_music_takeout = { + "Take out ", + &mTG_music_takeout_proc, +}; + +static mTG_tag_word_c mTG_tag_word_music_takeout_all = { + "Take out all ", + &mTG_music_takeout_proc, +}; + +static mTG_tag_word_c mTG_tag_word_hand_over_curator = { + "Give ", + &mTG_give_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_select_this = { + "Use ", + &mTG_nw_select_this_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_select_put = { + "Drop ", + &mTG_nw_select_this_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_select_change = { + "Swap ", + &mTG_nw_select_this_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_st_wear = { + "Use on Clothes ", + &mTG_nw_st_wear_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_st_umbrella = { + "Use on Umbrella ", + &mTG_nw_st_umbrella_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_cover = { + "Use on Walls ", + &mTG_stick_select_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_carpet = { + "Use on Floor ", + &mTG_stick_select_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_catch = { + "Grab ", + &mTG_catch_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_mr_sel_stick = { + "Use ", + &mTG_next_open_needlework_sel_stick_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_or_sel_stick = { + "Use ", + &mTG_next_open_needlework_sel_stick_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_sel_put = { + "Drop ", + &mTG_next_open_needlework_sel_put_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_put_umbrella = { + "Drop as Umbrella", + &mTG_nw_room_put_umbrella_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_put_wear = { + "Drop as Clothes ", + &mTG_nw_room_put_manekin_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_stk_pat_nrml = { + "Basic Paste ", + &mTG_nw_stk_pat_proc, +}; + +static mTG_tag_word_c mTG_tag_word_nw_stk_pat_turn = { + "Mix it up ", + &mTG_nw_stk_pat_proc, +}; + +static mTG_tag_word_c mTG_tag_word_remove = { + "Remove ", + &mTG_tag_remove_proc, +}; + +static mTG_tag_word_c mTG_tag_word_put_all = { + "Drop All ", + &mTG_put_all_proc, +}; + +static mTG_tag_word_c mTG_tag_word_put_chk = { + "That's Fine ", + &mTG_drop_proc, +}; + +static mTG_tag_word_c mTG_tag_word_never_mind = { + "Never mind ", + &mTG_cancel_proc, +}; + +static mTG_tag_word_c mTG_tag_word_change_original = { + "Swap ", + &mTG_change_original_proc, +}; + +static mTG_tag_word_c mTG_tag_word_password_item = { + "Give ", + &mTG_password_item_proc, +}; + +static u8 mTG_tag_str_suteruno[13] = "Throw it out?"; +static u8 mTG_tag_str_hontoni[6] = "??????"; +static u8 mTG_tag_str_iidesuka[6] = "??????"; +static u8 mTG_tag_str_put_chk1[11] = "You'll lose"; +static u8 mTG_tag_str_put_chk2[12] = "that design."; + +// clang-format off +static u8 mTG_catalog_str[][mCL_TAG_STR_SIZE] = { + "Furniture ", + "Wallpaper ", + "Carpet ", + "Clothing ", + "Items ", + "Stationery", + "Gyroids ", + "Fossils ", + "Music ", +}; +// clang-format on + +static mTG_tag_word_c* mTG_field_default[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_zimennioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_default_bury[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_zimennioku, + &mTG_tag_word_zimenniumeru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_letter[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_zimennioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_letter_bury[] = { + &mTG_tag_word_tukamu, &mTG_tag_word_tegamiwokaku, &mTG_tag_word_zimennioku, + &mTG_tag_word_zimenniumeru, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_sign[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_field_sign, + &mTG_tag_word_suteru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_balloon[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_fly, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_hukubukuro[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_akeru2, + &mTG_tag_word_zimennioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_hukubukuro_bury[] = { + &mTG_tag_word_tukamu, &mTG_tag_word_akeru2, &mTG_tag_word_zimennioku, + &mTG_tag_word_zimenniumeru, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_release[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_nigasu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_catch_item[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_plant[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_zimennioku, + &mTG_tag_word_zimenniueru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_plant_job[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_zimenniueru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_present_item[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_akeru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_default[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_heyanioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_wall[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_heyanioku, + &mTG_tag_word_kabeniharu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_carpet[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_heyanioku, + &mTG_tag_word_yukanisiku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_letter[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_heyanioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_hukubukuro[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_akeru2, + &mTG_tag_word_heyanioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_other_letter[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_other_hukubukuro[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_akeru2, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_def_rmail[] = { + &mTG_tag_word_yomu, + &mTG_tag_word_tukamu, + &mTG_tag_word_suteru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_rmail[] = { + &mTG_tag_word_yomu, + &mTG_tag_word_tukamu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_def_rmail_pre[] = { + &mTG_tag_word_yomu, + &mTG_tag_word_tukamu, + &mTG_tag_word_present, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_def_smail[] = { + &mTG_tag_word_kakinaosu, + &mTG_tag_word_tukamu, + &mTG_tag_word_suteru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_smail[] = { + &mTG_tag_word_kakinaosu, + &mTG_tag_word_tukamu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_def_smail_pre[] = { + &mTG_tag_word_kakinaosu, + &mTG_tag_word_tukamu, + &mTG_tag_word_present, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_dump_mail[] = { + &mTG_tag_word_dump_mail, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_dump_item[] = { + &mTG_tag_word_dump_item, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_money_sack3[] = { + &mTG_tag_word_100, + &mTG_tag_word_1000, + &mTG_tag_word_10000, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_quest_item[] = { + &mTG_tag_word_watasu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_sell_item[] = { + &mTG_tag_word_sell, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_give_item[] = { + &mTG_tag_word_ageru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_send_mail[] = { + &mTG_tag_word_okuru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_ticket[] = { + &mTG_tag_word_zenbutukamu, + &mTG_tag_word_1maitukamu, + &mTG_tag_word_zimennioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_ticket_bury[] = { + &mTG_tag_word_zenbutukamu, &mTG_tag_word_1maitukamu, &mTG_tag_word_zimennioku, + &mTG_tag_word_zimenniumeru, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_ticket[] = { + &mTG_tag_word_zenbutukamu, + &mTG_tag_word_1maitukamu, + &mTG_tag_word_heyanioku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_catch_ticket[] = { + &mTG_tag_word_zenbutukamu, + &mTG_tag_word_1maitukamu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_putin_item[] = { + &mTG_tag_word_korewoireru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_shrine_item[] = { + &mTG_tag_word_osameru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_haniwa_item[] = { + &mTG_tag_word_tukamu, &mTG_tag_word_tada, &mTG_tag_word_nedanwotukeru, + &mTG_tag_word_miserudake, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_haniwa_put_item[] = { + &mTG_tag_word_tada, + &mTG_tag_word_nedanwotukeru, + &mTG_tag_word_miserudake, +}; + +static mTG_tag_word_c* mTG_haniwa_get_item[] = { + &mTG_tag_word_itadaku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_haniwa_price[] = { + &mTG_tag_word_okane, + &mTG_tag_word_beru, +}; + +static mTG_tag_word_c* mTG_order_item[] = { + &mTG_tag_word_order, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_cp_delete[] = { + &mTG_tag_word_yameru, + &mTG_tag_word_kesu, +}; + +static mTG_tag_word_c* mTG_cp_delete2[] = { + &mTG_tag_word_iie, + &mTG_tag_word_hai, +}; + +static mTG_tag_word_c* mTG_field_mail_mark[] = { + &mTG_tag_word_dump_mail_mark_conf, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_dump_mail_mark_conf[] = { + &mTG_tag_word_dump_mail_mark_exe, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_mail_mark2[] = { + &mTG_tag_word_mailbox_change_mail, + &mTG_tag_word_dump_mail_mark_conf, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_cpack_mail_mark[] = { + &mTG_tag_word_cpmail_change_mail, + &mTG_tag_word_dump_mail_mark_conf, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_sell_all_item[] = { + &mTG_tag_word_sell_all, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_music_select[] = { + &mTG_tag_word_music_listen, + &mTG_tag_word_music_takeout, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_music_select_many[] = { + &mTG_tag_word_music_takeout_all, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_wisp[] = { + &mTG_tag_word_zenbutukamu, + &mTG_tag_word_1tamatukamu, + &mTG_tag_word_nigasu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_catch_wisp[] = { + &mTG_tag_word_zenbutukamu, + &mTG_tag_word_1tamatukamu, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_hand_over_curator[] = { + &mTG_tag_word_hand_over_curator, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_select[] = { + &mTG_tag_word_nw_select_this, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_my_room[] = { + &mTG_tag_word_nw_catch, + &mTG_tag_word_nw_mr_sel_stick, + &mTG_tag_word_nw_sel_put, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_ot_room[] = { + &mTG_tag_word_nw_catch, + &mTG_tag_word_nw_or_sel_stick, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_ug_room[] = { + &mTG_tag_word_nw_catch, + &mTG_tag_word_nw_mr_sel_stick, + &mTG_tag_word_nw_sel_put, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_mr_sel_stick[] = { + &mTG_tag_word_nw_st_wear, &mTG_tag_word_nw_st_umbrella, &mTG_tag_word_nw_cover, + &mTG_tag_word_nw_carpet, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_sel_put[] = { + &mTG_tag_word_nw_put_wear, + &mTG_tag_word_nw_put_umbrella, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_or_sel_stick[] = { + &mTG_tag_word_nw_st_wear, + &mTG_tag_word_nw_st_umbrella, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_sel_stk_pattern[] = { + &mTG_tag_word_nw_stk_pat_nrml, + &mTG_tag_word_nw_stk_pat_turn, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_remove[] = { + &mTG_tag_word_remove, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_put_all[] = { + &mTG_tag_word_put_all, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_put_chk[] = { + &mTG_tag_word_put_chk, + &mTG_tag_word_never_mind, +}; + +static mTG_tag_word_c* mTG_field_letters[] = { + &mTG_tag_word_tukamu, &mTG_tag_word_1maitukamu, &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_zimennioku, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_field_letters_bury[] = { + &mTG_tag_word_tukamu, &mTG_tag_word_1maitukamu, &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_zimennioku, &mTG_tag_word_zimenniumeru, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_room_letters[] = { + &mTG_tag_word_tukamu, &mTG_tag_word_1maitukamu, &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_heyanioku, &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_other_letters[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_1maitukamu, + &mTG_tag_word_tegamiwokaku, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_change_original[] = { + &mTG_tag_word_change_original, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_taisou_card[] = { + &mTG_tag_word_tukamu, + &mTG_tag_word_suteru, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_select_change[] = { + &mTG_tag_word_nw_select_change, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_nw_select_put[] = { + &mTG_tag_word_nw_select_put, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_tag_password_item[] = { + &mTG_tag_word_password_item, + &mTG_tag_word_yameru, +}; + +static mTG_tag_data_c mTG_label_table[] = { + { NULL, 0 }, /* mTG_TYPE_NONE */ + { mTG_field_default, ARRAY_COUNT(mTG_field_default) }, /* mTG_TYPE_FIELD_DEFAULT */ + { mTG_field_default_bury, ARRAY_COUNT(mTG_field_default_bury) }, /* mTG_TYPE_FIELD_DEFAULT_BURY */ + { mTG_field_letter, ARRAY_COUNT(mTG_field_letter) }, /* mTG_TYPE_FIELD_LETTER */ + { mTG_field_letter_bury, ARRAY_COUNT(mTG_field_letter_bury) }, /* mTG_TYPE_FIELD_LETTER_BURY */ + { mTG_field_hukubukuro, ARRAY_COUNT(mTG_field_hukubukuro) }, /* mTG_TYPE_FIELD_HUKUBUKURO */ + { mTG_field_hukubukuro_bury, ARRAY_COUNT(mTG_field_hukubukuro_bury) }, /* mTG_TYPE_FIELD_HUKUBUKURO_BURY */ + { mTG_field_release, ARRAY_COUNT(mTG_field_release) }, /* mTG_TYPE_FIELD_RELEASE */ + { mTG_catch_item, ARRAY_COUNT(mTG_catch_item) }, /* mTG_TYPE_CATCH_ITEM */ + { mTG_field_plant, ARRAY_COUNT(mTG_field_plant) }, /* mTG_TYPE_FIELD_PLANT */ + { mTG_field_plant_job, ARRAY_COUNT(mTG_field_plant_job) }, /* mTG_TYPE_FIELD_PLANT_JOB */ + { mTG_present_item, ARRAY_COUNT(mTG_present_item) }, /* mTG_TYPE_PRESENT_ITEM */ + { mTG_room_default, ARRAY_COUNT(mTG_room_default) }, /* mTG_TYPE_ROOM_DEFAULT */ + { mTG_room_wall, ARRAY_COUNT(mTG_room_wall) }, /* mTG_TYPE_ROOM_WALL */ + { mTG_room_carpet, ARRAY_COUNT(mTG_room_carpet) }, /* mTG_TYPE_ROOM_CARPET */ + { mTG_room_letter, ARRAY_COUNT(mTG_room_letter) }, /* mTG_TYPE_ROOM_LETTER */ + { mTG_room_hukubukuro, ARRAY_COUNT(mTG_room_hukubukuro) }, /* mTG_TYPE_ROOM_HUKUBUKURO */ + { mTG_other_letter, ARRAY_COUNT(mTG_other_letter) }, /* mTG_TYPE_OTHER_LETTER */ + { mTG_other_hukubukuro, ARRAY_COUNT(mTG_other_hukubukuro) }, /* mTG_TYPE_OTHER_HUKUBUKURO */ + { mTG_def_rmail, ARRAY_COUNT(mTG_def_rmail) }, /* mTG_TYPE_DEF_RMAIL */ + { mTG_room_rmail, ARRAY_COUNT(mTG_room_rmail) }, /* mTG_TYPE_ROOM_RMAIL */ + { mTG_def_rmail_pre, ARRAY_COUNT(mTG_def_rmail_pre) }, /* mTG_TYPE_DEF_RMAIL_PRE */ + { mTG_def_smail, ARRAY_COUNT(mTG_def_smail) }, /* mTG_TYPE_DEF_SMAIL */ + { mTG_room_smail, ARRAY_COUNT(mTG_room_smail) }, /* mTG_TYPE_ROOM_SMAIL */ + { mTG_def_smail_pre, ARRAY_COUNT(mTG_def_smail_pre) }, /* mTG_TYPE_DEF_SMAIL_PRE */ + { mTG_dump_mail, ARRAY_COUNT(mTG_dump_mail) }, /* mTG_TYPE_DUMP_MAIL */ + { mTG_money_sack3, ARRAY_COUNT(mTG_money_sack3) }, /* mTG_TYPE_MONEY_SACK */ + { mTG_quest_item, ARRAY_COUNT(mTG_quest_item) }, /* mTG_TYPE_QUEST_ITEM */ + { mTG_sell_item, ARRAY_COUNT(mTG_sell_item) }, /* mTG_TYPE_SELL_ITEM */ + { mTG_give_item, ARRAY_COUNT(mTG_give_item) }, /* mTG_TYPE_GIVE_ITEM */ + { mTG_send_mail, ARRAY_COUNT(mTG_send_mail) }, /* mTG_TYPE_SEND_MAIL */ + { mTG_field_ticket, ARRAY_COUNT(mTG_field_ticket) }, /* mTG_TYPE_FIELD_TICKET */ + { mTG_field_ticket_bury, ARRAY_COUNT(mTG_field_ticket_bury) }, /* mTG_TYPE_FIELD_TICKET_BURY */ + { mTG_room_ticket, ARRAY_COUNT(mTG_room_ticket) }, /* mTG_TYPE_ROOM_TICKET */ + { mTG_catch_ticket, ARRAY_COUNT(mTG_catch_ticket) }, /* mTG_TYPE_CATCH_TICKET */ + { mTG_putin_item, ARRAY_COUNT(mTG_putin_item) }, /* mTG_TYPE_PUTIN_ITEM */ + { mTG_shrine_item, ARRAY_COUNT(mTG_shrine_item) }, /* mTG_TYPE_SHRINE_ITEM */ + { mTG_haniwa_item, ARRAY_COUNT(mTG_haniwa_item) }, /* mTG_TYPE_HANIWA_ITEM */ + { mTG_haniwa_put_item, ARRAY_COUNT(mTG_haniwa_put_item) }, /* mTG_TYPE_HANIWA_PUT_ITEM */ + { mTG_haniwa_price, ARRAY_COUNT(mTG_haniwa_price) }, /* mTG_TYPE_HANIWA_PRICE */ + { mTG_haniwa_get_item, ARRAY_COUNT(mTG_haniwa_get_item) }, /* mTG_TYPE_HANIWA_GET_ITEM */ + { mTG_order_item, ARRAY_COUNT(mTG_order_item) }, /* mTG_TYPE_ORDER_ITEM */ + { mTG_cp_delete, ARRAY_COUNT(mTG_cp_delete) }, /* mTG_TYPE_CP_DELETE */ + { mTG_cp_delete2, ARRAY_COUNT(mTG_cp_delete2) }, /* mTG_TYPE_CP_DELETE2 */ + { mTG_field_mail_mark, ARRAY_COUNT(mTG_field_mail_mark) }, /* mTG_TYPE_FIELD_MAIL_MARK */ + { mTG_dump_mail_mark_conf, ARRAY_COUNT(mTG_dump_mail_mark_conf) }, /* mTG_TYPE_DUMP_MAIL_MARK_CONF */ + { mTG_field_mail_mark2, ARRAY_COUNT(mTG_field_mail_mark2) }, /* mTG_TYPE_FIELD_MAIL_MARK2 */ + { mTG_cpack_mail_mark, ARRAY_COUNT(mTG_cpack_mail_mark) }, /* mTG_TYPE_CPACK_MAIL_MARK */ + { mTG_sell_all_item, ARRAY_COUNT(mTG_sell_all_item) }, /* mTG_TYPE_SELL_ALL_ITEM */ + { mTG_music_select, ARRAY_COUNT(mTG_music_select) }, /* mTG_TYPE_MUSIC_SELECT */ + { mTG_music_select_many, ARRAY_COUNT(mTG_music_select_many) }, /* mTG_TYPE_MUSIC_SELECT_MANY */ + { mTG_field_wisp, ARRAY_COUNT(mTG_field_wisp) }, /* mTG_TYPE_FIELD_WISP */ + { mTG_catch_wisp, ARRAY_COUNT(mTG_catch_wisp) }, /* mTG_TYPE_CATCH_WISP */ + { mTG_tag_hand_over_curator, ARRAY_COUNT(mTG_tag_hand_over_curator) }, /* mTG_TYPE_TAG_HAND_OVER_CURATOR */ + { mTG_tag_nw_select, ARRAY_COUNT(mTG_tag_nw_select) }, /* mTG_TYPE_TAG_NW_SELECT */ + { mTG_tag_nw_my_room, ARRAY_COUNT(mTG_tag_nw_my_room) }, /* mTG_TYPE_TAG_NW_MY_ROOM */ + { mTG_tag_nw_ot_room, ARRAY_COUNT(mTG_tag_nw_ot_room) }, /* mTG_TYPE_TAG_NW_OT_ROOM */ + { mTG_tag_nw_ug_room, ARRAY_COUNT(mTG_tag_nw_ug_room) }, /* mTG_TYPE_TAG_NW_UG_ROOM */ + { mTG_tag_nw_mr_sel_stick, ARRAY_COUNT(mTG_tag_nw_mr_sel_stick) }, /* mTG_TYPE_TAG_NW_MR_SEL_STICK */ + { mTG_tag_nw_or_sel_stick, ARRAY_COUNT(mTG_tag_nw_or_sel_stick) }, /* mTG_TYPE_TAG_NW_OR_SEL_STICK */ + { mTG_tag_nw_sel_put, ARRAY_COUNT(mTG_tag_nw_sel_put) }, /* mTG_TYPE_TAG_NW_SEL_PUT */ + { mTG_tag_nw_sel_stk_pattern, ARRAY_COUNT(mTG_tag_nw_sel_stk_pattern) }, /* mTG_TYPE_TAG_NW_SEL_STK_PATTERN */ + { mTG_tag_remove, ARRAY_COUNT(mTG_tag_remove) }, /* mTG_TYPE_TAG_REMOVE */ + { mTG_tag_put_all, ARRAY_COUNT(mTG_tag_put_all) }, /* mTG_TYPE_TAG_PUT_ALL */ + { mTG_tag_put_chk, ARRAY_COUNT(mTG_tag_put_chk) }, /* mTG_TYPE_TAG_PUT_CHK */ + { mTG_field_letters, ARRAY_COUNT(mTG_field_letters) }, /* mTG_TYPE_FIELD_LETTERS */ + { mTG_field_letters_bury, ARRAY_COUNT(mTG_field_letters_bury) }, /* mTG_TYPE_FIELD_LETTERS_BURY */ + { mTG_room_letters, ARRAY_COUNT(mTG_room_letters) }, /* mTG_TYPE_ROOM_LETTERS */ + { mTG_other_letters, ARRAY_COUNT(mTG_other_letters) }, /* mTG_TYPE_OTHER_LETTERS */ + { mTG_change_original, ARRAY_COUNT(mTG_change_original) }, /* mTG_TYPE_CHANGE_ORIGINAL */ + { mTG_taisou_card, ARRAY_COUNT(mTG_taisou_card) }, /* mTG_TYPE_TAISOU_CARD */ + { mTG_dump_item, ARRAY_COUNT(mTG_dump_item) }, /* mTG_TYPE_DUMP_ITEM */ + { mTG_field_sign, ARRAY_COUNT(mTG_field_sign) }, /* mTG_TYPE_FIELD_SIGN */ + { mTG_field_balloon, ARRAY_COUNT(mTG_field_balloon) }, /* mTG_TYPE_FIELD_BALLOON */ + { mTG_tag_nw_select_change, ARRAY_COUNT(mTG_tag_nw_select_change) }, /* mTG_TYPE_TAG_NW_SELECT_CHANGE */ + { mTG_tag_nw_select_put, ARRAY_COUNT(mTG_tag_nw_select_put) }, /* mTG_TYPE_TAG_NW_SELECT_PUT */ + { NULL, 0 }, /* mTG_TYPE_76 */ + { mTG_tag_password_item, ARRAY_COUNT(mTG_tag_password_item) }, /* mTG_TYPE_TAG_PASSWORD_ITEM */ +}; + +static void mTG_init_tag_data_item_win(Submenu*); + +static int mTG_check_hand_condition(Submenu* submenu) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + int res = FALSE; + + if (hand_ovl->info.item == EMPTY_NO && mMl_check_not_used_mail(&hand_ovl->info.mail) == TRUE) { + res = TRUE; + } + + return res; +} + +static f32 mTG_set_hand_pos_offset(Submenu* submenu, int table) { + if (submenu->overlay->needlework_ovl != NULL) { + int nw_type = submenu->overlay->menu_info[mSM_OVL_NEEDLEWORK].data0; + + if (nw_type == 0) { + return 21.0f; + } else if (nw_type == 1 && table == mTG_TABLE_NEEDLEWORK) { + return 46.0f; + } + } else if (submenu->overlay->inventory_ovl != NULL) { + if (submenu->overlay->menu_info[mSM_OVL_INVENTORY].data0 == mSM_IV_OPEN_MAILBOX) { + return -155.0f; + } + } + + return 0.0f; +} + +static void mTG_set_hand_pos(Submenu* submenu, f32* pos, int table, int idx) { + mTG_tag_data_table_c* data_p = &mTG_table_data[table]; + f32 ofs = mTG_set_hand_pos_offset(submenu, table); + int col = idx % data_p->col_num; + int row = idx / data_p->col_num; + + pos[0] = data_p->col_pos[col] + ofs; + pos[1] = data_p->row_pos[row]; +} + +static int mTG_get_tag_idx(Submenu* submenu, int type) { + int idx = submenu->overlay->tag_ovl->sel_tag_idx; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[idx]; + int i; + + for (i = idx; i >= 0; i--) { + if (tag->type == type) { + return i; + } + + tag--; + } + + return -1; +} + +static void mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + int ret_idx = mTG_get_tag_idx(submenu, ret_type); + + if (ret_idx >= 0) { + if (ret_idx == 0) { + tag_ovl->ret_tag_idx = -1; + } else { + tag_ovl->ret_tag_idx = ret_idx; + } + + if (type == mTG_TYPE_NONE) { + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + int i; + + for (i = tag_ovl->sel_tag_idx - tag_ovl->ret_tag_idx; i != 0; i--) { + tag->base_pos[0] += tag->body_ofs[0]; + tag->base_pos[1] += tag->body_ofs[1]; + tag->body_ofs[0] = 0.0f; + tag->body_ofs[1] = 0.0f; + tag--; + } + } + } +} + +static u16 mTG_get_item_name_wait_time(mTG_tag_c* tag) { + u16 time = 20; + + tag->scale = 0.0f; + if (tag->table == mTG_TABLE_CATALOG_WC) { + time = 16; + } + + return time; +} + +static void mTG_return_tag_func(Submenu* submenu, mTG_Ovl_c* tag_ovl, mTG_tag_c* tag) { + int count = 0; + int tag_num = tag_ovl->sel_tag_idx - tag_ovl->ret_tag_idx; + int i; + + for (i = tag_num; i >= 0; i--) { + tag->scale -= 0.125f; + if (tag->scale <= 0.0f) { + if (tag->type == mTG_TYPE_NONE) { + tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); + } + + tag->scale = 0.0f; + count++; + } + + tag--; + } + + if (count == tag_num) { + if (tag_ovl->ret_tag_idx == -1) { + tag_ovl->ret_tag_idx = 0; + } + + tag_ovl->sel_tag_idx = tag_ovl->ret_tag_idx; + if (tag_ovl->sel_tag_idx == 0) { + mTG_init_tag_data_item_win(submenu); + } + } +} + +static int mTG_quest_disp_up_check(mTG_tag_c* tag) { + int res = FALSE; + + if ((tag->table == mTG_TABLE_ITEM && tag->tag_row == 0) || (tag->table == mTG_TABLE_MAIL && tag->tag_row == 2)) { + res = TRUE; + } + + return res; +} + +static int mTG_quest_disp_low_check(mTG_tag_c* tag) { + int res = FALSE; + + if ((tag->table == mTG_TABLE_MAIL && tag->tag_row == 1)) { + res = TRUE; + } + + return res; +} + +typedef struct tag_win_arrow_ofs_s { + f32 ofs[2]; + f32 scale[2]; +} mTG_win_arrow_ofs_c; + +typedef struct tag_win_data_s { + f32 _00[2]; + f32 _08[2]; + f32 _10; + f32 _14; + f32 _18; + f32 _1C[2]; + f32 _24[2]; + mTG_win_arrow_ofs_c* arrow_offset; +} mTG_win_data_c; + +enum { + mTG_WIN_TYPE_ITEM, + mTG_WIN_TYPE_SELECT, + mTG_WIN_TYPE_SELECT2, + + mTG_WIN_TYPE_NUM +}; + +static void mTG_set_tag_win_scale_p(mTG_tag_c* tag, int win_type, f32 x, f32 y) { + static mTG_win_arrow_ofs_c tag_win_data_pix_arrow_offset_item = { + { -3.5f, -3.5f }, + { -7.0f, 3.5f }, + }; + + static mTG_win_arrow_ofs_c tag_win_data_pix_arrow_offset_quest = { + { -1.0f, 21.0f }, + { -11.0f, 5.0f }, + }; + + static mTG_win_arrow_ofs_c tag_win_data_pix_arrow_offset_quest_up = { + { -13.0f, 4.0f }, + { -6.0f, 10.0f }, + }; + + static mTG_win_arrow_ofs_c tag_win_data_pix_arrow_offset_quest_low = { + { -13.0f, 56.0f }, + { -6.0f, -2.0f }, + }; + + static mTG_win_arrow_ofs_c tag_win_data_pix_arrow_offset_select = { + { 6.125f, 15.75f }, + { 0.875f, 26.25f }, + }; + + static mTG_win_data_c tag_win_data_pix[] = { + { + { 0.2972973f, 0.8125f }, + { -64.75f, 14.0f }, + 0.875f, + 21.0f, + 84.0f, + { 8.75f, -4.375f }, + { 4.375f, -2.625f }, + &tag_win_data_pix_arrow_offset_item, + }, + { + { 0.5714286f, 0.43243244f }, + { -61.25f, 64.75f }, + 0.875f, + 31.5f, + 42.0f, + { 22.75f, -14.875f }, + { 5.25f, -15.75f }, + &tag_win_data_pix_arrow_offset_select, + }, + }; + + mTG_win_data_c* win_data = &tag_win_data_pix[win_type]; + mTG_win_arrow_ofs_c* arrow_data = win_data->arrow_offset; + int i; + + tag->_04[0] = (x - win_data->_14) / win_data->_18; + + if (y != 0.0f) { + tag->_04[1] = (y - 28.0f) / 42.0f; + } else { + tag->_04[1] = tag->_04[0]; + } + + if (win_type == mTG_WIN_TYPE_SELECT) { + if (mTG_quest_disp_up_check(tag) == TRUE) { + arrow_data = &tag_win_data_pix_arrow_offset_quest_up; + } else if (mTG_quest_disp_low_check(tag) == TRUE) { + arrow_data = &tag_win_data_pix_arrow_offset_quest_low; + } + } + + tag->_34 = win_data->_10; + for (i = 0; i < 2; i++) { + tag->body_scale[i] = win_data->_00[i] + tag->_04[i] * (1.0f - win_data->_00[i]); + tag->arrow_scale[i] = 1.0f; + tag->text_ofs[i] = win_data->_1C[i] + win_data->_24[i] * tag->_04[i] + win_data->_08[i] * tag->body_scale[i]; + tag->body_ofs[i] = + arrow_data->ofs[i] + arrow_data->scale[i] * tag->_04[i] + win_data->_08[i] * tag->body_scale[i]; + } +} + +static int mTG_get_table_idx(mTG_tag_c* tag) { + int idx = tag->tag_col + tag->tag_row * mTG_table_data[tag->table].col_num; + + if (idx >= 0) { + return idx; + } + + return 0; +} + +static int mTG_check_edge_right_item(mTG_tag_c* tag) { + f32 edge; + int res = FALSE; + + if (tag->str2_type == 0) { + edge = 64.75f; + } else { + edge = 92.0f; + } + + if (tag->base_pos[0] + tag->body_ofs[0] + tag->body_scale[0] * edge >= 146.0f) { + res = TRUE; + } + + return res; +} + +static void mTG_calc_right_edge_select(mTG_tag_c* tag, f32* right_edge) { + f32 margin = tag->body_scale[0] * 122.5f; + + *right_edge = margin * 0.5 + tag->base_pos[0] + tag->body_ofs[0]; +} + +static int mTG_check_edge_right_select(mTG_tag_c* tag, f32* right_edge) { + f32 margin = tag->body_scale[0] * 122.5f; + + *right_edge = (margin * 0.5 + tag->base_pos[0] + tag->body_ofs[0]) - 134.0f; + + if (*right_edge <= 0.0f) { + return TRUE; + } + + return FALSE; +} + +static int mTG_check_edge_foot_select(mTG_tag_c* tag) { + int res = FALSE; + + tag->flags &= ~mTG_TAG_FLAG_EDGE_FOOT_SELECT; + if ((tag->base_pos[1] + tag->body_ofs[1]) - (tag->body_scale[1] * 129.5f) * 0.5f - 3.0f >= -120.0f) { + tag->flags |= mTG_TAG_FLAG_EDGE_FOOT_SELECT; + res = TRUE; + } + + return res; +} + +static int mTG_get_max_col_width_data(mTG_tag_word_c* tag_word, int lines) { + int max_col_width = 0; + int i; + + if (tag_word != NULL) { + for (i = 0; i < lines; i++) { + int len = mMl_strlen(tag_word[i].str, mTG_TAG_STR_LEN, CHAR_SPACE); + int width = mFont_GetStringWidth(tag_word[i].str, len, TRUE); + + if (max_col_width < width) { + max_col_width = width; + } + } + } + + return max_col_width; +} + +static void mTG_get_col_width_and_line_select(mTG_tag_c* tag, mTG_tag_data_c* tag_data, f32* max_width, + f32* max_height) { + *max_width = mTG_get_max_col_width_data(tag_data->words, tag_data->lines); + + switch (tag->type) { + case mTG_TYPE_CP_DELETE2: { + *max_height = (f32)(tag_data->lines + 2) * 16.0f; + *max_width = mFont_GetStringWidth(mTG_tag_str_iidesuka, sizeof(mTG_tag_str_iidesuka), TRUE); + break; + } + + case mTG_TYPE_DUMP_MAIL: + case mTG_TYPE_DUMP_MAIL_MARK_CONF: + case mTG_TYPE_DUMP_ITEM: { + f32 width; + + *max_height = (f32)(tag_data->lines + 1) * 16.0f; + width = mFont_GetStringWidth(mTG_tag_str_suteruno, sizeof(mTG_tag_str_suteruno), TRUE); + + if (*max_width < width) { + *max_width = width; + } + break; + } + + case mTG_TYPE_TAG_PUT_CHK: { + *max_width = mFont_GetStringWidth(mTG_tag_str_put_chk1, sizeof(mTG_tag_str_put_chk1), TRUE); + *max_height = (f32)(tag_data->lines + 2) * 16.0f; + break; + } + + default: { + *max_height = (f32)tag_data->lines * 16.0f; + break; + } + } +} + +static Mail_c* mTG_get_mail_pointer(Submenu* submenu, mHD_Ovl_c* hand_ovl) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + int table; + int idx; + int page; + + if (hand_ovl != NULL) { + table = hand_ovl->info.hold_tbl; + idx = hand_ovl->info.hold_idx; + page = hand_ovl->info.catch_pg; + } else { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + + table = tag->table; + idx = mTG_get_table_idx(tag); + + if (cpmail_ovl != NULL) { + page = cpmail_ovl->page_order[0]; + } else { + page = 0; + } + } + + switch (table) { + case mTG_TABLE_CPMAIL: + return &cpmail_ovl->card_mail->mail[page][idx]; + case mTG_TABLE_MBOX: + return &Common_Get(now_home)->mailbox[idx]; + default: + return &Now_Private->mail[idx]; + } +} + +static int mTG_strcat(u8* str0, u8* str1, int str0_max, int str1_max) { + int str0_len = mMl_strlen(str0, str0_max, CHAR_SPACE); + int str1_len = mMl_strlen(str1, str1_max, CHAR_SPACE); + + if (str0_max < (str0_len + str1_len)) { + str1_len -= (str0_len + str1_len) - str0_max; + } + + if (str1_len > 0) { + memcpy(&str0[str0_len], str1, str1_len); + str0_len += str1_len; + } + + return str0_len; +} + +static int mTG_strcpy(u8* dst, u8* src, int dst_max, int src_max) { + int src_len; + + mem_clear(dst, dst_max, CHAR_SPACE); + + src_len = mMl_strlen(src, src_max, CHAR_SPACE); + if (src_len < dst_max) { + dst_max = src_len; + } + + memcpy(dst, src, dst_max); + return dst_max; +} + +static int mTG_strcat_color(u8* str, u8* src, int str_max, int src_max, rgba_t* color) { + /* 0x7F 0x05 0x00 0x00 0x00 0x00 */ + static u8 font_color_base[] = { CHAR_CONTROL_CODE, mFont_CONT_CODE_COLOR, 0, 0, 0, 0 }; + int str_len = mMl_strlen(str, str_max, CHAR_SPACE); + int src_len = mMl_strlen(src, src_max, CHAR_SPACE); + + if ((str_max - src_len) - str_len > 1) { + int col_len = mTG_strcat(str, font_color_base, str_max, sizeof(font_color_base)); + + if (str_max < (col_len + src_len)) { + src_len -= (col_len + src_len) - str_max; + } + + str += col_len; + str[-4] = color->r; + str[-3] = color->g; + str[-2] = color->b; + str[-1] = (u8)src_len; + memcpy(str, src, src_len); + str_len = col_len + src_len; + } + + return str_len; +} + +typedef struct tag_str_info_s { + u8 str[mTG_TAG_SEL_STRING_LEN]; + int str_len; + int color_idx; +} mTG_str_info_c; + +enum { + mTG_MAIL_TYPE_NONE, + mTG_MAIL_TYPE_FROM, + mTG_MAIL_TYPE_FROM_THE, + mTG_MAIL_TYPE_FROM2, + mTG_MAIL_TYPE_FROM_S, + mTG_MAIL_TYPE_FROM3, + + mTG_MAIL_TYPE_NUM +}; + +enum { + mTG_MAIL_NAME_COLOR_RED, + mTG_MAIL_NAME_COLOR_VIOLET, + mTG_MAIL_NAME_COLOR_GREEN, + mTG_MAIL_NAME_COLOR_PURPLE, + mTG_MAIL_NAME_COLOR_INDIGO, + mTG_MAIL_NAME_COLOR_PINK, + mTG_MAIL_NAME_COLOR_BLACK, + + mTG_MAIL_NAME_COLOR_NUM +}; + +static int mTG_init_tag_data_item_win_sub_mail_item_mail(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + int type = mTG_MAIL_TYPE_FROM; + + mTG_strcpy(str_infos[1].str, mail->header.sender.personalID.player_name, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + + if (mail->header.recipient.type == mMl_NAME_TYPE_MUSEUM) { + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_VIOLET; + tag->str2_type = 4; + type = mTG_MAIL_TYPE_FROM_THE; + } else if (mail->header.sender.type == mMl_NAME_TYPE_MUSEUM) { + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_GREEN; + tag->str2_type = 3; + type = mTG_MAIL_TYPE_FROM2; + } else { + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_VIOLET; + tag->str2_type = 2; + } + + return type; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_xmas(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + u8* src; + + src = mNpc_GetNpcWorldNameP(SP_NPC_SANTA); + mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; + tag->str2_type = 5; + + return mTG_MAIL_TYPE_FROM; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_tanukiti(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + u8* src; + + src = mNpc_GetNpcWorldNameP(SP_NPC_SHOP_MASTER); + mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; + tag->str2_type = 6; + + return mTG_MAIL_TYPE_FROM; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_tunekiti(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + u8* src; + + src = mNpc_GetNpcWorldNameP(SP_NPC_BROKER); + mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; + tag->str2_type = 6; + + return mTG_MAIL_TYPE_FROM; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_mother(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + mTG_strcpy(str_infos[1].str, mother_str, mTG_TAG_SEL_STRING_LEN, sizeof(mother_str)); + str_infos[1].str_len = sizeof(mother_str); + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; + tag->str2_type = 7; + + return mTG_MAIL_TYPE_FROM2; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_omikuji(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + u8* src; + + src = mNpc_GetNpcWorldNameP(SP_NPC_EV_MIKO); + mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; + tag->str2_type = 9; + + return mTG_MAIL_TYPE_FROM_S; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_happy(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + mTG_strcpy(str_infos[1].str, str_happy_room, mTG_TAG_SEL_STRING_LEN, sizeof(str_happy_room)); + str_infos[1].str_len = sizeof(str_happy_room); + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_GREEN; + tag->str2_type = 11; + + return mTG_MAIL_TYPE_FROM; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_snowman(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + u8* src; + + src = mNpc_GetNpcWorldNameP(ETC_SNOWMAN_BALL_A); + mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; + tag->str2_type = 5; + + return mTG_MAIL_TYPE_FROM; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_angler(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + u8* src; + + src = mNpc_GetNpcWorldNameP(SP_NPC_ANGLER); + mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; + tag->str2_type = 8; + + return mTG_MAIL_TYPE_FROM; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_postoffice(mTG_tag_c* tag, mTG_str_info_c* str_infos, + Mail_c* mail) { + mTG_strcpy(str_infos[1].str, postoffice_str, mTG_TAG_SEL_STRING_LEN, sizeof(postoffice_str)); + str_infos[1].str_len = sizeof(postoffice_str); + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_GREEN; + tag->str2_type = 10; + + return mTG_MAIL_TYPE_FROM2; +} + +static int mTG_init_tag_data_item_win_sub_mail_item_sp_npc(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { + mTG_strcpy(str_infos[1].str, mail->header.sender.personalID.player_name, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + str_infos[1].str_len = PLAYER_NAME_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; + tag->str2_type = 5; + + return mTG_MAIL_TYPE_FROM; +} + +// clang-format off +static rgba_t str_color[] = { + { 205, 40, 40, 255 }, + { 100, 65, 195, 255 }, + { 60, 150, 65, 255 }, + { 54, 20, 255, 255 }, + { 60, 50, 155, 255 }, + { 225, 30, 220, 255 }, + { 0, 0, 0, 255 }, +}; +// clang-format on + +static void mTG_init_tag_data_item_win_sub_mail_item_set_string(mTG_tag_c* tag, mTG_str_info_c* str_infos, int type) { + switch (type) { + case mTG_MAIL_TYPE_FROM: { + mTG_strcat_color(tag->str0, str_infos[0].str, mTG_TAG_SEL_STRING_LEN, str_infos[0].str_len, + &str_color[str_infos[0].color_idx]); + mTG_strcat(tag->str1, str_title1, mTG_TAG_SEL_STRING_LEN, sizeof(str_title1)); + mTG_strcat_color(tag->str1, str_infos[1].str, mTG_TAG_SEL_STRING_LEN, str_infos[1].str_len, + &str_color[str_infos[1].color_idx]); + + break; + } + + case mTG_MAIL_TYPE_FROM_THE: { + mTG_strcat(tag->str0, str_title4, mTG_TAG_SEL_STRING_LEN, sizeof(str_title4)); + mTG_strcat_color(tag->str0, str_infos[0].str, mTG_TAG_SEL_STRING_LEN, str_infos[0].str_len, + &str_color[str_infos[0].color_idx]); + mTG_strcat(tag->str1, str_title1, mTG_TAG_SEL_STRING_LEN, sizeof(str_title1)); + mTG_strcat_color(tag->str1, str_infos[1].str, mTG_TAG_SEL_STRING_LEN, str_infos[1].str_len, + &str_color[str_infos[1].color_idx]); + + break; + } + + case mTG_MAIL_TYPE_FROM2: { + mTG_strcat_color(tag->str0, str_infos[0].str, mTG_TAG_SEL_STRING_LEN, str_infos[0].str_len, + &str_color[str_infos[0].color_idx]); + mTG_strcat(tag->str1, str_title1, mTG_TAG_SEL_STRING_LEN, sizeof(str_title1)); + mTG_strcat_color(tag->str1, str_infos[1].str, mTG_TAG_SEL_STRING_LEN, str_infos[1].str_len, + &str_color[str_infos[1].color_idx]); + + break; + } + + case mTG_MAIL_TYPE_FROM_S: { + mTG_strcat_color(tag->str0, str_infos[0].str, mTG_TAG_SEL_STRING_LEN, str_infos[0].str_len, + &str_color[str_infos[0].color_idx]); + mTG_strcat(tag->str0, str_title2, mTG_TAG_SEL_STRING_LEN, sizeof(str_title2)); + mTG_strcat(tag->str1, str_title1, mTG_TAG_SEL_STRING_LEN, sizeof(str_title1)); + mTG_strcat_color(tag->str1, str_infos[1].str, mTG_TAG_SEL_STRING_LEN, str_infos[1].str_len, + &str_color[str_infos[1].color_idx]); + + break; + } + + case mTG_MAIL_TYPE_FROM3: { + mTG_strcat_color(tag->str0, str_infos[0].str, mTG_TAG_SEL_STRING_LEN, str_infos[0].str_len, + &str_color[str_infos[0].color_idx]); + mTG_strcat(tag->str1, str_title1, mTG_TAG_SEL_STRING_LEN, sizeof(str_title1)); + mTG_strcat_color(tag->str1, str_infos[1].str, mTG_TAG_SEL_STRING_LEN, str_infos[1].str_len, + &str_color[str_infos[1].color_idx]); + + break; + } + } +} + +typedef int (*mTG_ITEM_WIN_SUB_MAIL_ITEM_PROC)(mTG_tag_c*, mTG_str_info_c*, Mail_c*); + +static void mTG_init_tag_data_item_win_sub_mail_item(Submenu* submenu, mTG_tag_c* tag, Mail_c* mail, + mActor_name_t itemNo, int itemCond, int idx) { + static mTG_ITEM_WIN_SUB_MAIL_ITEM_PROC proc[] = { + &mTG_init_tag_data_item_win_sub_mail_item_mail, &mTG_init_tag_data_item_win_sub_mail_item_xmas, + &mTG_init_tag_data_item_win_sub_mail_item_tanukiti, &mTG_init_tag_data_item_win_sub_mail_item_tunekiti, + &mTG_init_tag_data_item_win_sub_mail_item_mother, &mTG_init_tag_data_item_win_sub_mail_item_omikuji, + &mTG_init_tag_data_item_win_sub_mail_item_happy, &mTG_init_tag_data_item_win_sub_mail_item_tanukiti, + &mTG_init_tag_data_item_win_sub_mail_item_snowman, &mTG_init_tag_data_item_win_sub_mail_item_angler, + &mTG_init_tag_data_item_win_sub_mail_item_postoffice, &mTG_init_tag_data_item_win_sub_mail_item_sp_npc, + }; + static u8 present_str[7] = "Present"; + + f32 scale = 0.875f; + int win_type = mTG_WIN_TYPE_ITEM; + int mail_type = mTG_MAIL_TYPE_NONE; + mTG_str_info_c str_infos[3]; + int i; + + mem_clear(str_infos[0].str, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + mem_clear(str_infos[1].str, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + mem_clear(str_infos[2].str, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + + if (itemNo == EMPTY_NO) { + scale = 0.75f; + win_type = mTG_WIN_TYPE_SELECT; + mTG_strcpy(str_infos[0].str, mail->header.recipient.personalID.player_name, mTG_TAG_SEL_STRING_LEN, + PLAYER_NAME_LEN); + str_infos[0].str_len = PLAYER_NAME_LEN; + + if (mail->content.mail_type == mMl_TYPE_MAIL && mail->header.recipient.type == mMl_NAME_TYPE_MUSEUM) { + str_infos[0].color_idx = mTG_MAIL_NAME_COLOR_GREEN; + } else { + str_infos[0].color_idx = mTG_MAIL_NAME_COLOR_RED; + } + + mail_type = (*proc[mail->content.mail_type])(tag, str_infos, mail); + } else if (tag->table == mTG_TABLE_ITEM) { + tag->str2_type = 0; + win_type = mTG_WIN_TYPE_SELECT; + + /* Show quest item info */ + if ((itemCond & mPr_ITEM_COND_QUEST)) { + u8 str0[mTG_TAG_SEL_STRING_LEN]; + u8 str1[mTG_TAG_SEL_STRING_LEN]; + + mem_clear(str0, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + mem_clear(str1, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + + if (mQst_GetToFromName(str0, str1, idx) == TRUE) { + mTG_strcpy(str_infos[0].str, str0, mTG_TAG_SEL_STRING_LEN, mTG_TAG_SEL_STRING_LEN); + str_infos[0].str_len = mTG_TAG_SEL_STRING_LEN; + str_infos[0].color_idx = mTG_MAIL_NAME_COLOR_RED; + + mTG_strcpy(str_infos[1].str, str1, mTG_TAG_SEL_STRING_LEN, mTG_TAG_SEL_STRING_LEN); + str_infos[1].str_len = mTG_TAG_SEL_STRING_LEN; + str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_VIOLET; + + scale = 0.75f; + mail_type = mTG_MAIL_TYPE_FROM3; + tag->str2_type = 1; + } + } + } else { + tag->str2_type = 0; + } + + if (tag->str2_type == 0) { + if (itemCond == mPr_ITEM_COND_PRESENT) { + mem_copy(tag->str0, present_str, sizeof(present_str)); + } else if (itemNo >= ITM_MY_ORG_UMBRELLA0 && itemNo <= ITM_MY_ORG_UMBRELLA7) { + mem_copy(tag->str0, Now_Private->my_org[(itemNo - ITM_MY_ORG_UMBRELLA0) & 7].name, + mNW_ORIGINAL_DESIGN_NAME_LEN); + } else { + mIN_copy_name_str(tag->str0, itemNo); + } + + win_type = mTG_WIN_TYPE_ITEM; + } + + if (tag->str2_type != 0) { + if (tag->str2_type == 1) { + mTG_strcpy(tag->str2, str_otodokemono, mTG_TAG_SEL_STRING_LEN, sizeof(str_otodokemono)); + } else if (tag->str2_type == 9) { + mTG_strcpy(tag->str2, str_omikuji, mTG_TAG_SEL_STRING_LEN, sizeof(str_omikuji)); + } else { + mTG_strcpy(tag->str2, str_otegami, mTG_TAG_SEL_STRING_LEN, sizeof(str_otegami)); + } + } + + mTG_init_tag_data_item_win_sub_mail_item_set_string(tag, str_infos, mail_type); + + { + int str0_len = mMl_strlen(tag->str0, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + int str1_len = mMl_strlen(tag->str1, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + int str2_len = mMl_strlen(tag->str2, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + f32 width = mFont_GetStringWidth2(tag->str0, str0_len, TRUE); + f32 str1_width = mFont_GetStringWidth2(tag->str1, str1_len, TRUE); + f32 str2_width = mFont_GetStringWidth2(tag->str2, str2_len, TRUE); + + if (width < str1_width) { + width = str1_width; + } + + if (width < str2_width) { + width = str2_width; + } + + mTG_set_tag_win_scale_p(tag, win_type, width * scale, 0.0f); + } + + if (win_type == mTG_WIN_TYPE_SELECT && mTG_quest_disp_up_check(tag) == FALSE && + mTG_quest_disp_low_check(tag) == FALSE) { + tag->body_ofs[1] += 8.0f; + } + + if (mTG_check_edge_right_item(tag) == TRUE) { + tag->arrow_dir = 1; + } else { + tag->body_ofs[0] *= -1.0f; + tag->arrow_dir = 2; + } + + submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); +} + +static void mTG_init_tag_data_set_base_pos(mTG_tag_c* tag) { + switch (tag->table) { + case mTG_TABLE_NEEDLEWORK: + tag->base_pos[0] += -3.0f; + tag->base_pos[1] += -7.0f; + break; + case mTG_TABLE_CPORIGINAL: + case mTG_TABLE_CPORIGINAL_NW: + case mTG_TABLE_GBA: + case mTG_TABLE_GBA_NW: + case mTG_TABLE_CARD: + tag->base_pos[0] += -2.0f; + tag->base_pos[1] += -5.0f; + break; + case mTG_TABLE_CATALOG_WC: + tag->base_pos[0] += -8.75f; + break; + case mTG_TABLE_CPMAIL_WC: + tag->base_pos[0] += -8.75f; + break; + } +} + +static void mTG_init_tag_data_set_itemNo(mActor_name_t* itemNo, Mail_c** mail_pp, int* itemCond, Submenu* submenu, + int idx) { + switch (submenu->overlay->tag_ovl->tags[0].table) { + case mTG_TABLE_ITEM: + *itemNo = Now_Private->inventory.pockets[idx]; + *itemCond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + break; + case mTG_TABLE_PLAYER: + *itemNo = Now_Private->equipment; + break; + case mTG_TABLE_HANIWA: + *itemNo = Save_Get(homes[submenu->overlay->menu_info[mSM_OVL_HANIWA].data1]).haniwa.items[idx].item; + break; + case mTG_TABLE_COLLECT: + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + *itemNo = inv_ovl->set_collect_itemNo_proc(idx, inv_ovl->page_order[0]); + break; + case mTG_TABLE_MAIL: + case mTG_TABLE_MBOX: + case mTG_TABLE_CPMAIL: + *mail_pp = mTG_get_mail_pointer(submenu, NULL); + break; + default: + *itemNo = EMPTY_NO; + break; + } +} + +static void mTG_init_tag_data_catalog_win(Submenu* submenu, int idx) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int len; + f32 width; + + mem_copy(tag->str0, mTG_catalog_str[idx], mCL_TAG_STR_SIZE); + len = mMl_strlen(tag->str0, mTG_TAG_STR_LEN, CHAR_SPACE); + width = mFont_GetStringWidth(tag->str0, len, TRUE); + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_ITEM, width * 0.875f, 0.0f); + tag->body_ofs[0] *= -1.0f; + tag->arrow_dir = 2; + submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); +} + +static void mTG_init_tag_data_cpmail_wc_win(Submenu* submenu, int folder_idx) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + 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); + + if (len <= 0 || cpmail_ovl->page_order[0] == tag->tag_row) { + tag->arrow_dir = 0; + tag->str2_type = 0; + } else { + f32 width = mFont_GetStringWidth(tag->str0, len, TRUE); + + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_ITEM, width * 0.875f, 0.0f); + tag->str2_type = 0; + tag->body_ofs[0] *= -1.0f; + tag->arrow_dir = 2; + submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); + } +} + +static void mTG_init_tag_data_cporiginal_wc_win(Submenu* submenu) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int len; + + mem_copy(tag->str0, mCO_get_folder_name(submenu, tag->tag_row), mCO_FOLDER_NAME_LEN); + len = mMl_strlen(tag->str0, mCO_FOLDER_NAME_LEN, CHAR_SPACE); + + if (len <= 0 || mCO_top_folder(submenu) == tag->tag_row) { + tag->arrow_dir = 0; + tag->str2_type = 0; + } else { + f32 width = mFont_GetStringWidth(tag->str0, len, TRUE); + + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_ITEM, width * 0.875f, 0.0f); + tag->str2_type = 0; + tag->body_ofs[0] *= -1.0f; + tag->arrow_dir = 2; + submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); + } +} + +static void mTG_init_tag_data_needlework_win(Submenu* submenu, int idx) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int len; + + tag->str2_type = 0; + if (tag->table == mTG_TABLE_CPORIGINAL) { + int top = mCO_top_folder(submenu); + int hide = mCO_check_hide_flg(submenu, top, idx); + + if (hide) { + tag->arrow_dir = 0; + return; + } + } else { + int hide = mNW_check_hide_flg(submenu, idx); + + if (hide) { + tag->arrow_dir = 0; + return; + } + } + + switch (tag->table) { + case mTG_TABLE_CPORIGINAL: + mem_copy(tag->str0, mCO_get_image_name(submenu, mCO_top_folder(submenu), idx), + mNW_ORIGINAL_DESIGN_NAME_LEN); + break; + case mTG_TABLE_GBA: + case mTG_TABLE_CARD: + mem_copy(tag->str0, mGB_get_image_name(submenu, idx), mNW_ORIGINAL_DESIGN_NAME_LEN); + break; + default: + mem_copy(tag->str0, mNW_get_image_name(submenu, idx), mNW_ORIGINAL_DESIGN_NAME_LEN); + break; + } + + len = mMl_strlen(tag->str0, mNW_ORIGINAL_DESIGN_NAME_LEN, CHAR_SPACE); + if (len <= 0) { + tag->arrow_dir = 0; + } else { + f32 width = mFont_GetStringWidth(tag->str0, len, TRUE); + + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_ITEM, width * 0.875f, 0.0f); + switch (tag->table) { + case mTG_TABLE_CPORIGINAL: + case mTG_TABLE_CPORIGINAL_NW: + case mTG_TABLE_GBA: + case mTG_TABLE_CARD: + if (mTG_check_edge_right_item(tag) == TRUE) { + tag->arrow_dir = 1; + } else { + tag->body_ofs[0] *= -1.0f; + tag->arrow_dir = 2; + } + break; + default: + tag->body_ofs[0] *= -1.0f; + tag->arrow_dir = 2; + break; + } + + submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); + } +} + +static void mTG_init_tag_data_item_win(Submenu* submenu) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + mActor_name_t itemNo = EMPTY_NO; + Mail_c* mail = NULL; + int itemCond = mPr_ITEM_COND_NORMAL; + int idx = mTG_get_table_idx(tag); + + tag_ovl->sel_tag_idx = 0; + mTG_set_hand_pos(submenu, tag->base_pos, tag->table, idx); + mTG_init_tag_data_set_base_pos(tag); + mem_clear(tag->str0, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + mem_clear(tag->str1, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + mem_clear(tag->str2, mTG_TAG_SEL_STRING_LEN, CHAR_SPACE); + mTG_init_tag_data_set_itemNo(&itemNo, &mail, &itemCond, submenu, idx); + + if (itemNo != EMPTY_NO || (mail != NULL && mMl_check_not_used_mail(mail) == FALSE)) { + mTG_init_tag_data_item_win_sub_mail_item(submenu, tag, mail, itemNo, itemCond, idx); + } else { + if (tag->table == mTG_TABLE_CATALOG_WC) { + mTG_init_tag_data_catalog_win(submenu, idx); + } else if (tag->table == mTG_TABLE_CPMAIL_WC) { + mTG_init_tag_data_cpmail_wc_win(submenu, idx); + } else if (tag->table == mTG_TABLE_CPORIGINAL_WC) { + mTG_init_tag_data_cporiginal_wc_win(submenu); + } else if (tag->table == mTG_TABLE_CPORIGINAL_NW || tag->table == mTG_TABLE_NEEDLEWORK || + tag->table == mTG_TABLE_CPORIGINAL || tag->table == mTG_TABLE_GBA_NW || + tag->table == mTG_TABLE_CARD || tag->table == mTG_TABLE_GBA_NW2 || tag->table == mTG_TABLE_GBA) { + mTG_init_tag_data_needlework_win(submenu, idx); + } else { + tag->arrow_dir = 0; + } + } +} + +static void mTG_init_tag_data_select_win_only(mTG_tag_c* tag, mTG_tag_data_c* data) { + static f32 other_arrow_min_offset[][2] = { + { 6.125f, 15.75f }, + { -4.375f, 15.75f }, + { 4.375f, -15.75f }, + { -6.125f, -15.75f }, + }; + + static f32 other_arrow_offset_dis[][2] = { + { 0.875f, 26.25f }, + { 0.875f, 26.25f }, + { -0.875f, -26.25f }, + { -0.875f, -26.25f }, + }; + + f32 max_width; + f32 max_height; + f32 dist_right; + int edge_right; + int edge_foot; + f32* min_ofs_p; + f32* ofs_dis_p; + int idx; + f32 dir_x; + f32 dir_y; + + mTG_get_col_width_and_line_select(tag, data, &max_width, &max_height); + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_SELECT2, max_width * 0.875f, max_height * 0.875f); + edge_right = mTG_check_edge_right_select(tag, &dist_right); + edge_foot = mTG_check_edge_foot_select(tag); + + if (edge_right) { + tag->arrow_dir = 1; + dir_x = 1.0f; + if (edge_foot) { + idx = 0; + dir_y = -1.0f; + } else { + idx = 2; + dir_y = 1.0f; + } + } else { + tag->arrow_dir = 2; + dir_x = -1.0f; + if (edge_foot) { + idx = 1; + dir_y = -1.0f; + } else { + idx = 3; + dir_y = 1.0f; + } + } + + min_ofs_p = other_arrow_min_offset[idx]; + ofs_dis_p = other_arrow_offset_dis[idx]; + + tag->body_ofs[0] = min_ofs_p[0] + ofs_dis_p[0] * tag->_04[0] + tag->body_scale[0] * 61.25f * dir_x; + tag->body_ofs[1] = min_ofs_p[1] + ofs_dis_p[1] * tag->_04[1] + (tag->body_scale[1] * 61.25f - 6.0f) * dir_y; +} + +typedef struct add_item_data_s { + f32 down_min[2][2]; + f32 down_ofs[2][2]; + + f32 up_min[2][2]; + f32 up_ofs[2][2]; +} mTG_add_item_data_c; + +static void mTG_init_tag_data_select_win_after_item(mTG_tag_c* tag, mTG_tag_c* item_tag, mTG_tag_data_c* tag_data) { + // clang-format off + static mTG_add_item_data_c tag_add_item_data[] = { + { + { { 27.125f, 1.750f }, { 54.250f, 1.750f } }, /* down_min */ + { { 27.125f, -1.750f }, { 54.250f, -1.750f } }, /* down_ofs */ + + { { -29.750f, 6.125f }, { -28.875f, 8.750f } }, /* up_min */ + { { -29.750f, -6.125f }, { -28.875f, -8.750f } }, /* up_ofs */ + }, + { + { { 52.500f, 4.375f }, { 39.375f, 0.000f } }, + { { 52.500f, -4.375f }, { 39.375f, 0.000f } }, + + { { -27.125f, 7.000f }, { -28.000f, 8.750f } }, + { { -27.125f, -7.000f }, { -28.000f, -8.750f } }, + }, + }; + // clang-format on + + mTG_add_item_data_c* data_p; + f32 max_width; + f32 max_height; + f32 scale_x; + f32 scale_y; + int left_flag; + + mTG_get_col_width_and_line_select(tag, tag_data, &max_width, &max_height); + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_SELECT2, max_width * 0.875f, max_height * 0.875f); + + if (item_tag->body_ofs[0] < 0.0f) { + left_flag = TRUE; + } else { + left_flag = FALSE; + } + + if (item_tag->str2_type != 0) { + scale_y = 68.0f; + scale_x = 184.0f; + data_p = &tag_add_item_data[1]; + } else { + scale_y = 28.0f; + scale_x = 129.5f; + data_p = &tag_add_item_data[0]; + } + + tag->base_pos[1] += data_p->down_min[0][1] + (item_tag->body_ofs[1] - item_tag->body_scale[1] * scale_y * 0.5f) + + item_tag->_04[1] * data_p->down_min[1][1]; + tag->body_ofs[1] = (data_p->up_min[0][1] + tag->_04[1] * data_p->up_min[1][1]) - tag->body_scale[1] * 129.0f * 0.5f; + + tag->base_pos[0] += item_tag->body_ofs[0] - item_tag->body_scale[0] * scale_x * 0.5f; + tag->body_ofs[0] = tag->body_scale[0] * 122.5f * 0.5f; + + // TODO +} diff --git a/src/save_check.c_inc b/src/save_check.c_inc index 4dd49056..10d6cfa9 100644 --- a/src/save_check.c_inc +++ b/src/save_check.c_inc @@ -2,581 +2,574 @@ #include "m_house.h" static int sChk_block_num_sub(u32 block_x, u32 block_z) { - int res = FALSE; + int res = FALSE; - if (block_x > FG_BLOCK_X_NUM && block_x != 0xFF) { - mFRm_ERRORLINE(79); - res = TRUE; - } + if (block_x > FG_BLOCK_X_NUM && block_x != 0xFF) { + mFRm_ERRORLINE(79); + res = TRUE; + } - if (block_z > FG_BLOCK_Z_NUM && block_z != 0xFF) { - mFRm_ERRORLINE(90); - res = TRUE; - } + if (block_z > FG_BLOCK_Z_NUM && block_z != 0xFF) { + mFRm_ERRORLINE(90); + res = TRUE; + } - if (block_z == mISL_BLOCK_Z && (block_x == mISL_BLOCK_X0 || block_x == mISL_BLOCK_X1)) { - res = FALSE; - } + if (block_z == mISL_BLOCK_Z && (block_x == mISL_BLOCK_X0 || block_x == mISL_BLOCK_X1)) { + res = FALSE; + } - return res; + return res; } static int sChk_ut_num_sub(u32 ut_x, u32 ut_z) { - int res = FALSE; + int res = FALSE; - if (ut_x >= UT_X_NUM && ut_x != 0xFF) { - mFRm_ERRORLINE(140); - res = TRUE; - } + if (ut_x >= UT_X_NUM && ut_x != 0xFF) { + mFRm_ERRORLINE(140); + res = TRUE; + } - if (ut_z >= UT_Z_NUM && ut_z != 0xFF) { - mFRm_ERRORLINE(151); - res = TRUE; - } + if (ut_z >= UT_Z_NUM && ut_z != 0xFF) { + mFRm_ERRORLINE(151); + res = TRUE; + } - return res; + return res; } static int sChk_ItemFG_sub(mActor_name_t item) { - int res = FALSE; + int res = FALSE; - if (item != EMPTY_NO && (ITEM_NAME_GET_TYPE(item) >= NAME_TYPE_WARP || ITEM_NAME_GET_TYPE(item) < NAME_TYPE_FTR0)) { - mFRm_ERRORLINE(201); - res = TRUE; - } + if (item != EMPTY_NO && (ITEM_NAME_GET_TYPE(item) >= NAME_TYPE_WARP || ITEM_NAME_GET_TYPE(item) < NAME_TYPE_FTR0)) { + mFRm_ERRORLINE(201); + res = TRUE; + } - return res; + return res; } static int sChk_cloth_sub(mActor_name_t item) { - int valid_cloth; - int res = FALSE; + int valid_cloth; + int res = FALSE; - valid_cloth = item == RSV_CLOTH || (item >= ITM_CLOTH_START && item < ITM_CLOTH_END); + valid_cloth = item == RSV_CLOTH || (item >= ITM_CLOTH_START && item < ITM_CLOTH_END); - if (valid_cloth == FALSE && item != EMPTY_NO) { - mFRm_ERRORLINE(247); - res = TRUE; - } + if (valid_cloth == FALSE && item != EMPTY_NO) { + mFRm_ERRORLINE(247); + res = TRUE; + } - return res; + return res; } static int sChk_fruit_sub(mActor_name_t item) { - int res = FALSE; + int res = FALSE; - if (item < ITM_FOOD_APPLE || item > ITM_FOOD_ORANGE) { - mFRm_ERRORLINE(288); - res = TRUE; - } + if (item < ITM_FOOD_APPLE || item > ITM_FOOD_ORANGE) { + mFRm_ERRORLINE(288); + res = TRUE; + } - return res; + return res; } static int sChk_OSRTCTime_sub(OSRTCTime* time) { - int res = FALSE; + int res = FALSE; - if (time->year < GAME_YEAR_MIN || time->year > GAME_YEAR_MAX) { - res = TRUE; - } - - if (time->month == 0 || time->month > lbRTC_MONTHS_MAX) { - res = TRUE; - } - - if (time->day == 0 || time->day > 31) { - res = TRUE; - } - - if (time->weekday > lbRTC_SATURDAY) { - res = TRUE; - } - - if (time->hour > 23) { - res = TRUE; - } - - if (time->min > 59) { - res = TRUE; - } - - if (time->sec > 59) { - res = TRUE; - } - - if (res == TRUE) { - if (time->year == 0 && time->month == 0 && time->day == 0 && time->weekday == 0 && time->hour == 0 && time->min == 0 && time->sec == 0) { - res = FALSE; + if (time->year < GAME_YEAR_MIN || time->year > GAME_YEAR_MAX) { + res = TRUE; } - else if (mTM_AreTimesEqual(time, &mTM_rtcTime_clear_code) == TRUE) { - res = FALSE; - } - else { - mFRm_ERRORLINE(379); - } - } - return res; + if (time->month == 0 || time->month > lbRTC_MONTHS_MAX) { + res = TRUE; + } + + if (time->day == 0 || time->day > 31) { + res = TRUE; + } + + if (time->weekday > lbRTC_SATURDAY) { + res = TRUE; + } + + if (time->hour > 23) { + res = TRUE; + } + + if (time->min > 59) { + res = TRUE; + } + + if (time->sec > 59) { + res = TRUE; + } + + if (res == TRUE) { + if (time->year == 0 && time->month == 0 && time->day == 0 && time->weekday == 0 && time->hour == 0 && + time->min == 0 && time->sec == 0) { + res = FALSE; + } else if (mTM_AreTimesEqual(time, &mTM_rtcTime_clear_code) == TRUE) { + res = FALSE; + } else { + mFRm_ERRORLINE(379); + } + } + + return res; } static int sChk_lbRTC_ymd_c_sub(lbRTC_ymd_c* ymd) { - int res = FALSE; + int res = FALSE; - if (ymd->year < GAME_YEAR_MIN || ymd->year > GAME_YEAR_MAX) { - res = TRUE; - } - - if (ymd->month == 0 || ymd->month > lbRTC_MONTHS_MAX) { - res = TRUE; - } - - if (ymd->day == 0 || ymd->day > 31) { - res = TRUE; - } - - if (res == TRUE) { - if (ymd->year == 0 && ymd->month == 0 && ymd->day == 0) { - res = FALSE; + if (ymd->year < GAME_YEAR_MIN || ymd->year > GAME_YEAR_MAX) { + res = TRUE; } - else if (ymd->year == mTM_rtcTime_ymd_clear_code.year && ymd->month == mTM_rtcTime_ymd_clear_code.month && ymd->day == mTM_rtcTime_ymd_clear_code.day) { - res = FALSE; - } - else { - mFRm_ERRORLINE(464); - } - } - return res; + if (ymd->month == 0 || ymd->month > lbRTC_MONTHS_MAX) { + res = TRUE; + } + + if (ymd->day == 0 || ymd->day > 31) { + res = TRUE; + } + + if (res == TRUE) { + if (ymd->year == 0 && ymd->month == 0 && ymd->day == 0) { + res = FALSE; + } else if (ymd->year == mTM_rtcTime_ymd_clear_code.year && ymd->month == mTM_rtcTime_ymd_clear_code.month && + ymd->day == mTM_rtcTime_ymd_clear_code.day) { + res = FALSE; + } else { + mFRm_ERRORLINE(464); + } + } + + return res; } static int sChk_Mail_nm_c_sub(Mail_nm_c* mail_name, int depth) { - int res = FALSE; + int res = FALSE; - if (mail_name->type >= mMl_NAME_TYPE_NUM && mail_name->type != mMl_NAME_TYPE_CLEAR) { - mFRm_ERRORLINE(519); - res = TRUE; - } + if (mail_name->type >= mMl_NAME_TYPE_NUM && mail_name->type != mMl_NAME_TYPE_CLEAR) { + mFRm_ERRORLINE(519); + res = TRUE; + } - return res; + return res; } static int sChk_Mail_hdr_c_sub(Mail_hdr_c* mail_header, int depth) { - int res = FALSE; - - res |= sChk_Mail_nm_c_sub(&mail_header->recipient, depth + 1); - res |= sChk_Mail_nm_c_sub(&mail_header->sender, depth + 1); - - return res; + int res = FALSE; + + res |= sChk_Mail_nm_c_sub(&mail_header->recipient, depth + 1); + res |= sChk_Mail_nm_c_sub(&mail_header->sender, depth + 1); + + return res; } static int sChk_font_sub(u8* font_p) { - int font = *font_p; - int res = FALSE; + int font = *font_p; + int res = FALSE; - /* This check seems wrong lol */ - if (font != 0xFF && (font >= 0xFF || font >= mMl_FONT_NUM || font < mMl_FONT_0)) { - mFRm_ERRORLINE(612); - res = TRUE; - } + /* This check seems wrong lol */ + if (font != 0xFF && (font >= 0xFF || font >= mMl_FONT_NUM || font < mMl_FONT_0)) { + mFRm_ERRORLINE(612); + res = TRUE; + } - return res; + return res; } static int sChk_header_back_start_sub(u8* header_back_start_p) { - int res = FALSE; + int res = FALSE; - if (*header_back_start_p > MAIL_HEADER_LEN) { - mFRm_ERRORLINE(657); - res = TRUE; - } + if (*header_back_start_p > MAIL_HEADER_LEN) { + mFRm_ERRORLINE(657); + res = TRUE; + } - return res; + return res; } static int sChk_paper_type_sub(u8* paper_type) { - int res = FALSE; + int res = FALSE; - if (*paper_type > (ITM_PAPER63 - ITM_PAPER00)) { - mFRm_ERRORLINE(701); - res = TRUE; - } + if (*paper_type > (ITM_PAPER63 - ITM_PAPER00)) { + mFRm_ERRORLINE(701); + res = TRUE; + } - return res; + return res; } static int sChk_Mail_ct_c_sub(Mail_ct_c* contents, int depth) { - int res = sChk_font_sub(&contents->font); - - res |= sChk_header_back_start_sub(&contents->header_back_start); + int res = sChk_font_sub(&contents->font); - if (contents->mail_type > mMl_TYPE_12) { - mFRm_ERRORLINE(766); - res = TRUE; - } + res |= sChk_header_back_start_sub(&contents->header_back_start); - res |= sChk_paper_type_sub(&contents->paper_type); + if (contents->mail_type > mMl_TYPE_NUM) { + mFRm_ERRORLINE(766); + res = TRUE; + } - return res; + res |= sChk_paper_type_sub(&contents->paper_type); + + return res; } static int sChk_Mail_c_sub(Mail_c* mail, int depth) { - int res = FALSE; - - res |= sChk_Mail_hdr_c_sub(&mail->header, depth + 1); - res |= sChk_ItemFG_sub(mail->present); - res |= sChk_Mail_ct_c_sub(&mail->content, depth + 1); + int res = FALSE; - return res; + res |= sChk_Mail_hdr_c_sub(&mail->header, depth + 1); + res |= sChk_ItemFG_sub(mail->present); + res |= sChk_Mail_ct_c_sub(&mail->content, depth + 1); + + return res; } static int sChk_mHm_rmsz_c_sub(mHm_rmsz_c* room_size, int depth) { - lbRTC_ymd_c order_date_copy; - int res; + lbRTC_ymd_c order_date_copy; + int res; - order_date_copy.day = room_size->upgrade_order_date.day; - order_date_copy.month = room_size->upgrade_order_date.month; - order_date_copy.year = room_size->upgrade_order_date.year; + order_date_copy.day = room_size->upgrade_order_date.day; + order_date_copy.month = room_size->upgrade_order_date.month; + order_date_copy.year = room_size->upgrade_order_date.year; - res = sChk_lbRTC_ymd_c_sub(&order_date_copy); + res = sChk_lbRTC_ymd_c_sub(&order_date_copy); - if (room_size->size >= mHm_HOMESIZE_NUM) { - mFRm_ERRORLINE(880); - res = TRUE; - } + if (room_size->size >= mHm_HOMESIZE_NUM) { + mFRm_ERRORLINE(880); + res = TRUE; + } - if (room_size->next_size >= mHm_HOMESIZE_NUM) { - mFRm_ERRORLINE(894); - res = TRUE; - } + if (room_size->next_size >= mHm_HOMESIZE_NUM) { + mFRm_ERRORLINE(894); + res = TRUE; + } - return res; + return res; } static int sChk_Haniwa_Item_c_sub(Haniwa_Item_c* haniwa_item, int depth) { - int res = sChk_ItemFG_sub(haniwa_item->item); + int res = sChk_ItemFG_sub(haniwa_item->item); - if (haniwa_item->exchange_type > mHm_HANIWA_TRADE_3) { - mFRm_ERRORLINE(947); - res = TRUE; - } + if (haniwa_item->exchange_type > mHm_HANIWA_TRADE_3) { + mFRm_ERRORLINE(947); + res = TRUE; + } - return res; + return res; } static int sChk_Haniwa_c_sub(Haniwa_c* haniwa, int depth) { - int i; - int res = FALSE; + int i; + int res = FALSE; - for (i = 0; i < HANIWA_ITEM_HOLD_NUM; i++) { - res |= sChk_Haniwa_Item_c_sub(haniwa->items + i, depth + 1); - } + for (i = 0; i < HANIWA_ITEM_HOLD_NUM; i++) { + res |= sChk_Haniwa_Item_c_sub(haniwa->items + i, depth + 1); + } - return res; + return res; } static int sChk_outlook_pal_sub(u8 outlook_pal) { - int res = FALSE; + int res = FALSE; - if (outlook_pal >= mHm_OUTLOOK_PAL_NUM) { - mFRm_ERRORLINE(1035); - res = TRUE; - } + if (outlook_pal >= mHm_OUTLOOK_PAL_NUM) { + mFRm_ERRORLINE(1035); + res = TRUE; + } - return res; + return res; } static int sChk_mHm_goki_c_sub(mHm_goki_c* goki, int depth) { - return sChk_OSRTCTime_sub(&goki->time); + return sChk_OSRTCTime_sub(&goki->time); } static int sChk_mHm_hs_c_sub(mHm_hs_c* house, int depth) { - int i; - int res = FALSE; + int i; + int res = FALSE; - res |= sChk_lbRTC_ymd_c_sub(&house->hra_mark_time); - res |= sChk_mHm_rmsz_c_sub(&house->size_info, depth + 1); - res |= sChk_outlook_pal_sub(house->outlook_pal); - res |= sChk_outlook_pal_sub(house->ordered_outlook_pal); - res |= sChk_outlook_pal_sub(house->next_outlook_pal); + res |= sChk_lbRTC_ymd_c_sub(&house->hra_mark_time); + res |= sChk_mHm_rmsz_c_sub(&house->size_info, depth + 1); + res |= sChk_outlook_pal_sub(house->outlook_pal); + res |= sChk_outlook_pal_sub(house->ordered_outlook_pal); + res |= sChk_outlook_pal_sub(house->next_outlook_pal); - for (i = 0; i < HOME_MAILBOX_SIZE; i++) { - res |= sChk_Mail_c_sub(house->mailbox + i, depth + 1); - } + for (i = 0; i < HOME_MAILBOX_SIZE; i++) { + res |= sChk_Mail_c_sub(house->mailbox + i, depth + 1); + } - res |= sChk_Haniwa_c_sub(&house->haniwa, depth + 1); - res |= sChk_mHm_goki_c_sub(&house->goki, depth + 1); + res |= sChk_Haniwa_c_sub(&house->haniwa, depth + 1); + res |= sChk_mHm_goki_c_sub(&house->goki, depth + 1); - return res; + return res; } static int sChk_AnmPersonalID_c_sub(AnmPersonalID_c* pid, int depth) { - int res = FALSE; + int res = FALSE; - if (ITEM_NAME_GET_TYPE(pid->npc_id) != NAME_TYPE_NPC && pid->npc_id != EMPTY_NO) { - mFRm_ERRORLINE(1200); - res = TRUE; - } + if (ITEM_NAME_GET_TYPE(pid->npc_id) != NAME_TYPE_NPC && pid->npc_id != EMPTY_NO) { + mFRm_ERRORLINE(1200); + res = TRUE; + } - if (pid->looks > mNpc_LOOKS_NUM) { - mFRm_ERRORLINE(1214); - res = TRUE; - } + if (pid->looks > mNpc_LOOKS_NUM) { + mFRm_ERRORLINE(1214); + res = TRUE; + } - return res; + return res; } static int sChk_Anmplmail_c_sub(Anmplmail_c* animal_player_mail, int depth) { - int res = FALSE; + int res = FALSE; - res |= sChk_font_sub(&animal_player_mail->font); - res |= sChk_paper_type_sub(&animal_player_mail->paper_type); - res |= sChk_ItemFG_sub(animal_player_mail->present); - res |= sChk_header_back_start_sub(&animal_player_mail->header_back_start); - res |= sChk_lbRTC_ymd_c_sub(&animal_player_mail->date); + res |= sChk_font_sub(&animal_player_mail->font); + res |= sChk_paper_type_sub(&animal_player_mail->paper_type); + res |= sChk_ItemFG_sub(animal_player_mail->present); + res |= sChk_header_back_start_sub(&animal_player_mail->header_back_start); + res |= sChk_lbRTC_ymd_c_sub(&animal_player_mail->date); - return res; + return res; } static int sChk_Anmmem_c_sub(Anmmem_c* animal_memory, int depth) { - int res = FALSE; + int res = FALSE; - res |= sChk_OSRTCTime_sub(&animal_memory->last_speak_time); - res |= sChk_Anmplmail_c_sub(&animal_memory->letter, depth + 1); + res |= sChk_OSRTCTime_sub(&animal_memory->last_speak_time); + res |= sChk_Anmplmail_c_sub(&animal_memory->letter, depth + 1); - return res; + return res; } static int sChk_Anmhome_c_sub(Anmhome_c* animal_home, int depth) { - int res = FALSE; + int res = FALSE; - if (animal_home->type_unused > 5) { - mFRm_ERRORLINE(1365); - res = TRUE; - } + if (animal_home->type_unused > 5) { + mFRm_ERRORLINE(1365); + res = TRUE; + } - res |= sChk_block_num_sub(animal_home->block_x, animal_home->block_z); - res |= sChk_ut_num_sub(animal_home->ut_x, animal_home->ut_z); + res |= sChk_block_num_sub(animal_home->block_x, animal_home->block_z); + res |= sChk_ut_num_sub(animal_home->ut_x, animal_home->ut_z); - return res; + return res; } static int sChk_Animal_c_sub(Animal_c* animal, int depth) { - int i; - int res = FALSE; + int i; + int res = FALSE; - res |= sChk_AnmPersonalID_c_sub(&animal->id, depth + 1); + res |= sChk_AnmPersonalID_c_sub(&animal->id, depth + 1); - for (i = 0; i < ANIMAL_MEMORY_NUM; i++) { - res |= sChk_Anmmem_c_sub(animal->memories + i, depth + 1); - } + for (i = 0; i < ANIMAL_MEMORY_NUM; i++) { + res |= sChk_Anmmem_c_sub(animal->memories + i, depth + 1); + } - res |= sChk_Anmhome_c_sub(&animal->home_info, depth + 1); + res |= sChk_Anmhome_c_sub(&animal->home_info, depth + 1); - if (animal->mood >= mNpc_MOOD_NUM) { - mFRm_ERRORLINE(1458); - res = TRUE; - } + if (animal->mood >= mNpc_MOOD_NUM) { + mFRm_ERRORLINE(1458); + res = TRUE; + } - res |= sChk_cloth_sub(animal->cloth); + res |= sChk_cloth_sub(animal->cloth); - if ((animal->is_home & ~1)) { - mFRm_ERRORLINE(1474); - res = TRUE; - } + if ((animal->is_home & ~1)) { + mFRm_ERRORLINE(1474); + res = TRUE; + } - res |= sChk_cloth_sub(animal->present_cloth); + res |= sChk_cloth_sub(animal->present_cloth); - return res; + return res; } static int sChk_Kabu_price_c_sub(Kabu_price_c* kabu_price, int depth) { - int res = FALSE; - int i; + int res = FALSE; + int i; - for (i = 0; i < lbRTC_WEEK; i++) { - if (kabu_price->daily_price[i] < Kabu_PRICE_MIN || kabu_price->daily_price[i] > Kabu_PRICE_MAX) { - mFRm_ERRORLINE(1531); - res = TRUE; + for (i = 0; i < lbRTC_WEEK; i++) { + if (kabu_price->daily_price[i] < Kabu_PRICE_MIN || kabu_price->daily_price[i] > Kabu_PRICE_MAX) { + mFRm_ERRORLINE(1531); + res = TRUE; - break; + break; + } } - } - if (kabu_price->trade_market >= Kabu_TRADE_MARKET_TYPE_NUM) { - mFRm_ERRORLINE(1554); - res = TRUE; - } + if (kabu_price->trade_market >= Kabu_TRADE_MARKET_TYPE_NUM) { + mFRm_ERRORLINE(1554); + res = TRUE; + } - res |= sChk_OSRTCTime_sub(&kabu_price->update_time); + res |= sChk_OSRTCTime_sub(&kabu_price->update_time); - return res; + return res; } static int sChk_PostOffice_c_sub(PostOffice_c* post_office, int depth) { - int i; - int res = FALSE; + int i; + int res = FALSE; - if (post_office->keep_mail_sum_players < 0 || post_office->keep_mail_sum_players > mPO_KEEP_MAIL_PLAYERS_MAX) { - mFRm_ERRORLINE(1617); - res = TRUE; - } + if (post_office->keep_mail_sum_players < 0 || post_office->keep_mail_sum_players > mPO_KEEP_MAIL_PLAYERS_MAX) { + mFRm_ERRORLINE(1617); + res = TRUE; + } - if (post_office->keep_mail_sum_npcs < 0) { - mFRm_ERRORLINE(1632); - res = TRUE; - } + if (post_office->keep_mail_sum_npcs < 0) { + mFRm_ERRORLINE(1632); + res = TRUE; + } - if (post_office->mail_recipient_flags & (u16)(~0b1111)) { - mFRm_ERRORLINE(1647); - res = TRUE; - } + if (post_office->mail_recipient_flags & (u16)(~0b1111)) { + mFRm_ERRORLINE(1647); + res = TRUE; + } - for (i = 0; i < mPO_MAIL_STORAGE_SIZE; i++) { - res |= sChk_Mail_c_sub(post_office->mail + i, depth + 1); - } + for (i = 0; i < mPO_MAIL_STORAGE_SIZE; i++) { + res |= sChk_Mail_c_sub(post_office->mail + i, depth + 1); + } - res |= sChk_Mail_c_sub(&post_office->leaflet, depth + 1); - res |= sChk_Mail_c_sub(&post_office->event_leaflet, depth + 1); + res |= sChk_Mail_c_sub(&post_office->leaflet, depth + 1); + res |= sChk_Mail_c_sub(&post_office->event_leaflet, depth + 1); - if (post_office->leaflet_recipient_flags.leaflet_flags & (u16)(~0b1111)) { - mFRm_ERRORLINE(1668); - res = TRUE; - } + if (post_office->leaflet_recipient_flags.leaflet_flags & (u16)(~0b1111)) { + mFRm_ERRORLINE(1668); + res = TRUE; + } - if (post_office->leaflet_recipient_flags.event_flags & (u16)(~0b1111)) { - mFRm_ERRORLINE(1682); - res = TRUE; - } + if (post_office->leaflet_recipient_flags.event_flags & (u16)(~0b1111)) { + mFRm_ERRORLINE(1682); + res = TRUE; + } - res |= sChk_OSRTCTime_sub(&post_office->delivery_time); + res |= sChk_OSRTCTime_sub(&post_office->delivery_time); - return res; + return res; } static int sChk_PoliceBox_c_sub(PoliceBox_c* police_box, int depth) { - int i; - int res = FALSE; + int i; + int res = FALSE; - for (i = 0; i < mPB_POLICE_BOX_ITEM_STORAGE_COUNT; i++) { - res |= sChk_ItemFG_sub(police_box->keep_items[i]); - } + for (i = 0; i < mPB_POLICE_BOX_ITEM_STORAGE_COUNT; i++) { + res |= sChk_ItemFG_sub(police_box->keep_items[i]); + } - return res; + return res; } static int sChk_Config_c_sub(Config_c* config, int depth) { - int res = FALSE; + int res = FALSE; - if (config->sound_mode > Config_SOUND_MODE_NUM) { - mFRm_ERRORLINE(1775); - res = TRUE; - } + if (config->sound_mode > Config_SOUND_MODE_NUM) { + mFRm_ERRORLINE(1775); + res = TRUE; + } - if (config->voice_mode > Config_VOICE_MODE_NUM) { - mFRm_ERRORLINE(1789); - res = TRUE; - } + if (config->voice_mode > Config_VOICE_MODE_NUM) { + mFRm_ERRORLINE(1789); + res = TRUE; + } - if (config->vibration_enabled & (~1)) { - mFRm_ERRORLINE(1803); - res = TRUE; - } + if (config->vibration_enabled & (~1)) { + mFRm_ERRORLINE(1803); + res = TRUE; + } - return res; + return res; } static int sChk_mMsr_time_c_sub(mMsr_time_c* mushroom_time, int depth) { - int res = FALSE; + int res = FALSE; - if (mushroom_time->year < GAME_YEAR_MIN && mushroom_time->year > GAME_YEAR_MAX) { - res = TRUE; - } - - if (mushroom_time->month == 0 || mushroom_time->month > lbRTC_DECEMBER) { - res = TRUE; - } - - if (mushroom_time->day == 0 || mushroom_time->day > 31) { - res = TRUE; - } - - if (mushroom_time->hour > 23) { - res = TRUE; - } - - if (res == TRUE) { - if ( - mushroom_time->year == 0 && - mushroom_time->month == 0 && - mushroom_time->day == 0 && - mushroom_time->hour == 0 && - mushroom_time->hour_quarter == 0 - ) { - res = FALSE; + if (mushroom_time->year < GAME_YEAR_MIN && mushroom_time->year > GAME_YEAR_MAX) { + res = TRUE; } - else { - mFRm_ERRORLINE(1876); - } - } - return res; + if (mushroom_time->month == 0 || mushroom_time->month > lbRTC_DECEMBER) { + res = TRUE; + } + + if (mushroom_time->day == 0 || mushroom_time->day > 31) { + res = TRUE; + } + + if (mushroom_time->hour > 23) { + res = TRUE; + } + + if (res == TRUE) { + if (mushroom_time->year == 0 && mushroom_time->month == 0 && mushroom_time->day == 0 && + mushroom_time->hour == 0 && mushroom_time->hour_quarter == 0) { + res = FALSE; + } else { + mFRm_ERRORLINE(1876); + } + } + + return res; } static int sChk_MaskCat_c_sub(MaskCat_c* mask_cat, int depth) { - int valid_cloth; - int res = FALSE; + int valid_cloth; + int res = FALSE; - if (mask_cat->palette_no >= mNW_PALETTE_NUM) { - mFRm_ERRORLINE(1935); - res = TRUE; - } + if (mask_cat->palette_no >= mNW_PALETTE_NUM) { + mFRm_ERRORLINE(1935); + res = TRUE; + } - /* This is definitely a macro */ - valid_cloth = (mActor_name_t)(mask_cat->cloth_no + ITM_CLOTH_START) >= ITM_CLOTH_START && (mActor_name_t)(mask_cat->cloth_no + ITM_CLOTH_START) < ITM_CLOTH_END; - if (valid_cloth == FALSE) { - mFRm_ERRORLINE(1949); - res = TRUE; - } + /* This is definitely a macro */ + valid_cloth = (mActor_name_t)(mask_cat->cloth_no + ITM_CLOTH_START) >= ITM_CLOTH_START && + (mActor_name_t)(mask_cat->cloth_no + ITM_CLOTH_START) < ITM_CLOTH_END; + if (valid_cloth == FALSE) { + mFRm_ERRORLINE(1949); + res = TRUE; + } - if (mask_cat->talk_idx > mMC_TALK_IDX_MAX) { - mFRm_ERRORLINE(1963); - res = TRUE; - } + if (mask_cat->talk_idx > mMC_TALK_IDX_MAX) { + mFRm_ERRORLINE(1963); + res = TRUE; + } - res |= sChk_OSRTCTime_sub(&mask_cat->time); + res |= sChk_OSRTCTime_sub(&mask_cat->time); - return res; + return res; } static int sChk_check_save_data() { - int res = FALSE; - Save_t* save = Common_GetPointer(save.save); - int i; + int res = FALSE; + Save_t* save = Common_GetPointer(save.save); + int i; - for (i = 0; i < mHS_HOUSE_NUM; i++) { - res |= sChk_mHm_hs_c_sub(save->homes + i, 1); - } + for (i = 0; i < mHS_HOUSE_NUM; i++) { + res |= sChk_mHm_hs_c_sub(save->homes + i, 1); + } - for (i = 0; i < ANIMAL_NUM_MAX; i++) { - res |= sChk_Animal_c_sub(save->animals + i, 1); - } + for (i = 0; i < ANIMAL_NUM_MAX; i++) { + res |= sChk_Animal_c_sub(save->animals + i, 1); + } - res |= sChk_AnmPersonalID_c_sub(&save->last_removed_animal_id, 1); - res |= sChk_Kabu_price_c_sub(&save->kabu_price_schedule, 1); - res |= sChk_fruit_sub(save->fruit); - res |= sChk_OSRTCTime_sub(&save->all_grow_renew_time); - res |= sChk_PostOffice_c_sub(&save->post_office, 1); - res |= sChk_PoliceBox_c_sub(&save->police_box, 1); - res |= sChk_Config_c_sub(&save->config, 1); - res |= sChk_lbRTC_ymd_c_sub(&save->renew_time); - res |= sChk_OSRTCTime_sub(&save->last_grow_time); - res |= sChk_mMsr_time_c_sub(&save->mushroom_time, 1); - res |= sChk_lbRTC_ymd_c_sub(&save->_021322); - res |= sChk_OSRTCTime_sub(&save->_02136E); - res |= sChk_OSRTCTime_sub(&save->treasure_buried_time); - res |= sChk_OSRTCTime_sub(&save->treasure_checked_time); - res |= sChk_lbRTC_ymd_c_sub(&save->force_remove_date); - res |= sChk_MaskCat_c_sub(&save->mask_cat, 1); + res |= sChk_AnmPersonalID_c_sub(&save->last_removed_animal_id, 1); + res |= sChk_Kabu_price_c_sub(&save->kabu_price_schedule, 1); + res |= sChk_fruit_sub(save->fruit); + res |= sChk_OSRTCTime_sub(&save->all_grow_renew_time); + res |= sChk_PostOffice_c_sub(&save->post_office, 1); + res |= sChk_PoliceBox_c_sub(&save->police_box, 1); + res |= sChk_Config_c_sub(&save->config, 1); + res |= sChk_lbRTC_ymd_c_sub(&save->renew_time); + res |= sChk_OSRTCTime_sub(&save->last_grow_time); + res |= sChk_mMsr_time_c_sub(&save->mushroom_time, 1); + res |= sChk_lbRTC_ymd_c_sub(&save->_021322); + res |= sChk_OSRTCTime_sub(&save->_02136E); + res |= sChk_OSRTCTime_sub(&save->treasure_buried_time); + res |= sChk_OSRTCTime_sub(&save->treasure_checked_time); + res |= sChk_lbRTC_ymd_c_sub(&save->force_remove_date); + res |= sChk_MaskCat_c_sub(&save->mask_cat, 1); - return res; + return res; } From ab4a552ed439618ba527f5ca28024dc7ad6d1e10 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Fri, 24 May 2024 14:22:19 -0400 Subject: [PATCH 5/8] Missing header update --- include/m_gba_ovl.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/m_gba_ovl.h b/include/m_gba_ovl.h index f720b999..f1fcf695 100644 --- a/include/m_gba_ovl.h +++ b/include/m_gba_ovl.h @@ -10,7 +10,7 @@ extern "C" { extern void mGB_copy_image(Submenu*, mActor_name_t, mActor_name_t); extern void mGB_draw_gba(Submenu* submenu, GRAPH* graph, f32 pos_x, f32 pos_y, f32 scale, int idx, int color_flag); - +extern u8* mGB_get_image_name(Submenu* submenu, int idx); extern void mGB_gba_ovl_construct(Submenu* submenu); extern void mGB_gba_ovl_destruct(Submenu* submenu); extern void mGB_gba_ovl_set_proc(Submenu* submenu); From 03dd18a5ab9dfa4c0af29bf2c7f691a398ae792e Mon Sep 17 00:00:00 2001 From: Cuyler36 <24523422+Cuyler36@users.noreply.github.com> Date: Thu, 17 Oct 2024 16:34:42 -0400 Subject: [PATCH 6/8] m_tag_ovl 50% matched by function count --- include/audio_defs.h | 15 +- include/m_common_data.h | 13 + include/m_cpmail_ovl.h | 5 +- include/m_haniwa_ovl.h | 19 + include/m_haniwa_ovl_h.h | 2 + include/m_inventory_ovl.h | 4 +- include/m_mailbox_ovl.h | 14 + include/m_mailbox_ovl_h.h | 2 + include/m_music_ovl.h | 7 +- include/m_music_ovl_h.h | 2 +- include/m_name_table.h | 5 + include/m_needlework.h | 7 + include/m_needlework_ovl.h | 9 + include/m_needlework_ovl_h.h | 16 + include/m_private.h | 12 +- include/m_submenu_ovl.h | 11 +- include/m_tag_ovl.h | 37 +- include/m_warning_ovl.h | 2 +- src/ac_my_room.c | 1 - src/m_hand_ovl.c | 4 +- src/m_inventory_ovl.c | 16 +- src/m_private.c | 12 +- src/m_soncho.c | 12 +- src/m_tag_ovl.c | 2576 ++++++++++++++++++++++++++++++++-- 24 files changed, 2675 insertions(+), 128 deletions(-) create mode 100644 include/m_needlework_ovl_h.h diff --git a/include/audio_defs.h b/include/audio_defs.h index c79fbe40..8a730450 100644 --- a/include/audio_defs.h +++ b/include/audio_defs.h @@ -17,16 +17,19 @@ extern "C" { #define SE_FLAG_15(id) ((id) | 0x8000) // TODO: Make the rest of Sound Effects with parameters -#define SE_REGISTER MONO(0x50) +#define SE_REGISTER MONO(NA_SE_REGISTER) typedef enum audio_sound_effects { NA_SE_START, NA_SE_CURSOL, NA_SE_MENU_EXIT, + NA_SE_3 = 3, + NA_SE_ZOOMUP = 4, NA_SE_ZOOMDOWN_SHORT, + NA_SE_A = 0xA, NA_SE_PAGE_OKURI = 0xB, NA_SE_SENTAKU_OPEN, @@ -39,9 +42,13 @@ typedef enum audio_sound_effects { NA_SE_25 = 0x25, NA_SE_26 = 0x26, + NA_SE_2A = 0x2A, + NA_SE_MENU_PAUSE = 0x30, NA_SE_31 = 0x31, + NA_SE_33 = 0x33, + NA_SE_DRAWER_SHUT = 0x3A, NA_SE_ITEM_GET = 0x40, @@ -52,6 +59,8 @@ typedef enum audio_sound_effects { NA_SE_COIN, NA_SE_TEMOCHI_KAZAGURUMA, + NA_SE_REGISTER = 0x50, + NA_SE_52 = 0x52, NA_SE_ITEM_HORIDASHI = 0x57, @@ -61,6 +70,7 @@ typedef enum audio_sound_effects { NA_SE_AMI_HIT = 0x5C, NA_SE_TOOL_GET, + NA_SE_5F = 0x5F, NA_SE_60 = 0x60, NA_SE_GASAGOSO = 0x69, @@ -158,6 +168,9 @@ typedef enum audio_sound_effects { NA_SE_UMBRELLA_ROTATE = 0x432, + NA_SE_435 = 0x435, + NA_SE_436 = 0x436, + NA_SE_KARABURI = 0x43A, NA_SE_ROD_STROKE_SMALL = 0x445, diff --git a/include/m_common_data.h b/include/m_common_data.h index 192cd1e5..5a9674e1 100644 --- a/include/m_common_data.h +++ b/include/m_common_data.h @@ -356,6 +356,19 @@ extern common_data_t common_data; #define Get_Island() (Save_Get(island)) #define Get_Island_Villager() (Get_Island().animal) +#define GetRoomMusicBox() (Save_Get(scene_no) == SCENE_COTTAGE_MY \ + ? Save_Get(island).cottage.music_box \ + : Save_Get(homes[mHS_get_arrange_idx(Common_Get(player_no))]).music_box) +#define ChkMusicBox(box, n) (((box)[((n) / 32) & 1] >> ((n) & 31)) & 1) +#define SetMusicBox(box, n) ((box)[((n) / 32) & 1] |= (1 << ((n) & 31))) +#define ClrMusicBox(box, n) ((box)[((n) / 32) & 1] &= ~(u32)(1 << ((n) & 31))) +#define ChkRoomMusicBox(n) ChkMusicBox(GetRoomMusicBox(), n) +#define SetRoomMusicBox(n) SetMusicBox(GetRoomMusicBox(), n) +#define ClrRoomMusicBox(n) ClrMusicBox(GetRoomMusicBox(), n) + +#define CLIP(n) (Common_Get(clip).n) +#define aMR_CLIP (Common_Get(clip).my_room_clip) + extern void common_data_reinit(); extern void common_data_init(); extern void common_data_clear(); diff --git a/include/m_cpmail_ovl.h b/include/m_cpmail_ovl.h index f6c0b3a6..a771e9f5 100644 --- a/include/m_cpmail_ovl.h +++ b/include/m_cpmail_ovl.h @@ -24,7 +24,10 @@ struct cpmail_ovl_s { mCD_mail_c* card_mail; Mail_c player_mail[mPr_INVENTORY_MAIL_COUNT]; u8 page_order[mCM_PAGE_COUNT]; - u8 _BB0[0xBC4 - 0xBB0]; + u32 _BB0; + u32 mark_bitfield; + int mark_flag; + u8 _BBC[0xBC4 - 0xBBC]; }; extern void mCM_cpmail_ovl_construct(Submenu* submenu); diff --git a/include/m_haniwa_ovl.h b/include/m_haniwa_ovl.h index 18c9b07a..f01de02a 100644 --- a/include/m_haniwa_ovl.h +++ b/include/m_haniwa_ovl.h @@ -2,11 +2,30 @@ #define M_HANIWA_OVL_H #include "types.h" +#include "m_haniwa_ovl_h.h" +#include "m_tag_ovl.h" #ifdef __cplusplus extern "C" { #endif +#define mHW_OVL_MSG_SIZE 22 + +typedef void (*mHW_SET_INTERRUPT_MESSAGE_PROC)(Submenu*, mTG_tag_c*, int); + +struct haniwa_ovl_s { + int msg_idx; + int msg_interrupt_idx; + int table_idx; + int sub_idx; + int msg_time; + int msg_counter; + u32 msg_price; + u32 price; + u8 msg[mHW_OVL_MSG_SIZE]; + mHW_SET_INTERRUPT_MESSAGE_PROC set_interrupt_message_proc; +}; + extern void mHW_haniwa_ovl_construct(Submenu* submenu); extern void mHW_haniwa_ovl_destruct(Submenu* submenu); extern void mHW_haniwa_ovl_set_proc(Submenu* submenu); diff --git a/include/m_haniwa_ovl_h.h b/include/m_haniwa_ovl_h.h index accb48d5..c3c052ec 100644 --- a/include/m_haniwa_ovl_h.h +++ b/include/m_haniwa_ovl_h.h @@ -7,6 +7,8 @@ extern "C" { #endif +typedef struct haniwa_ovl_s mHW_Ovl_c; + #ifdef __cplusplus } #endif diff --git a/include/m_inventory_ovl.h b/include/m_inventory_ovl.h index 757d3a0d..d9cd9cce 100644 --- a/include/m_inventory_ovl.h +++ b/include/m_inventory_ovl.h @@ -96,8 +96,8 @@ struct inventory_ovl_s { mIV_pl_eff_c pl_eff[mIV_PLAYER_EFFECT_NUM]; mIV_SET_COLLECT_ITEMNO_PROC set_collect_itemNo_proc; u16 item_mark_bitfield; - u16 _5E2; - s16 _5E4; + u16 mail_mark_bitfield2; + s16 mail_mark_flag; u8 _5E6[2]; u16 mail_mark_bitfield; u8 original_flag; diff --git a/include/m_mailbox_ovl.h b/include/m_mailbox_ovl.h index 5e85bd13..0737d341 100644 --- a/include/m_mailbox_ovl.h +++ b/include/m_mailbox_ovl.h @@ -2,11 +2,25 @@ #define M_MAILBOX_OVL_H #include "types.h" +#include "m_mailbox_ovl_h.h" #ifdef __cplusplus extern "C" { #endif +typedef int (*mMB_GET_LAST_MAIL_IDX_PROC)(void); + +struct mailbox_ovl_s { + u8 open_flag; + u8 _01; + u8 display_flag; + u8 _03; + int _04; + u16 mark_bitfield; + int mark_flag; + mMB_GET_LAST_MAIL_IDX_PROC get_last_mail_idx_proc; +}; + extern void mMB_mailbox_ovl_construct(Submenu* submenu); extern void mMB_mailbox_ovl_destruct(Submenu* submenu); extern void mMB_mailbox_ovl_set_proc(Submenu* submenu); diff --git a/include/m_mailbox_ovl_h.h b/include/m_mailbox_ovl_h.h index 97c14269..6a709aec 100644 --- a/include/m_mailbox_ovl_h.h +++ b/include/m_mailbox_ovl_h.h @@ -7,6 +7,8 @@ extern "C" { #endif +typedef struct mailbox_ovl_s mMB_Ovl_c; + #ifdef __cplusplus } #endif diff --git a/include/m_music_ovl.h b/include/m_music_ovl.h index ec30c545..a589892c 100644 --- a/include/m_music_ovl.h +++ b/include/m_music_ovl.h @@ -9,7 +9,12 @@ extern "C" { #endif -struct music_ovl_s; +struct music_ovl_s { + u8 title[mIN_ITEM_NAME_LEN]; + s16 title_width; + mActor_name_t title_md_item; + u32 mark_flg[2]; +}; extern void mMU_music_ovl_set_proc(Submenu* submenu); extern void mMU_music_ovl_construct(Submenu* submenu); diff --git a/include/m_music_ovl_h.h b/include/m_music_ovl_h.h index f05013af..94c8200c 100644 --- a/include/m_music_ovl_h.h +++ b/include/m_music_ovl_h.h @@ -7,7 +7,7 @@ extern "C" { #endif -typedef struct music_ovl_s mMU_Overlay_c; +typedef struct music_ovl_s mMU_Ovl_c; #ifdef __cplusplus } diff --git a/include/m_name_table.h b/include/m_name_table.h index 344146f3..20beb1f6 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -526,6 +526,11 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITEM_IS_SIGNBOARD(item) ((item) >= SIGNBOARD_START && (item) <= SIGNBOARD_END) +#define ITEM_IS_FLOWER_BAG(item) ((item) >= ITM_WHITE_PANSY_BAG && (item) <= ITM_YELLOW_TULIP_BAG) +#define ITEM_IS_EXERCISE_CARD(item) ((item) >= ITM_EXCERCISE_CARD00 && (item) <= ITM_EXCERCISE_CARD12) +#define ITEM_IS_BALLOON(item) ((item) >= ITM_BALLOON_START && (item) <= ITM_BUNNY_O_BALLOON) +#define ITEM_IS_UMBRELLA(item) ((item) >= ITM_UMBRELLA_START && (item) <= ITM_UMBRELLA_END) + #define BG_CATEGORY 0 #define ENV_CATEGORY 8 diff --git a/include/m_needlework.h b/include/m_needlework.h index 29b0b8a3..d69132cd 100644 --- a/include/m_needlework.h +++ b/include/m_needlework.h @@ -42,6 +42,13 @@ enum { mNW_PALETTE_NUM }; +enum { + mNW_TYPE_MANEKIN, + mNW_TYPE_UMBRELLA, + + mNW_TYPE_NUM +}; + typedef struct original_texture_s { u8 data[mNW_DESIGN_TEX_SIZE]; } ATTRIBUTE_ALIGN(32) mNW_original_tex_c; diff --git a/include/m_needlework_ovl.h b/include/m_needlework_ovl.h index 4c5076a8..4230ceba 100644 --- a/include/m_needlework_ovl.h +++ b/include/m_needlework_ovl.h @@ -3,11 +3,20 @@ #include "types.h" #include "m_submenu.h" +#include "m_needlework_ovl_h.h" +#include "m_needlework.h" #ifdef __cplusplus extern "C" { #endif +struct needlework_ovl_s { + u16 mark_flg; + u16 hide_flg; + mNW_original_design_c my_org[mPr_ORIGINAL_DESIGN_COUNT]; + u8 my_org_no_table[mPr_ORIGINAL_DESIGN_COUNT]; +}; + extern u8 mNW_get_image_no(Submenu* submenu, int slot_no); extern u8* mNW_get_image_name(Submenu* submenu, int idx); extern int mNW_check_hide_flg(Submenu* submenu, int idx); diff --git a/include/m_needlework_ovl_h.h b/include/m_needlework_ovl_h.h new file mode 100644 index 00000000..2dcd5d6c --- /dev/null +++ b/include/m_needlework_ovl_h.h @@ -0,0 +1,16 @@ +#ifndef M_NEEDLEWORK_OVL_H_H +#define M_NEEDLEWORK_OVL_H_H + +#include "types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct needlework_ovl_s mNW_Ovl_c; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/m_private.h b/include/m_private.h index aa52f30b..ba6acb74 100644 --- a/include/m_private.h +++ b/include/m_private.h @@ -291,14 +291,14 @@ extern int mPr_GetPossessionItemIdxItem1CategoryWithCond_cancel(Private_c* priv, mActor_name_t cancel_item); extern int mPr_GetPossessionItemIdxKindWithCond(Private_c* priv, mActor_name_t kind_start, mActor_name_t kind_end, u32 cond); -extern int mPr_GetPossessionItemSum(Private_c* priv, mActor_name_t item); -extern int mPr_GetPossessionItemSumWithCond(Private_c* priv, mActor_name_t item, u32 cond); -extern int mPr_GetPossessionItemSumFGTypeWithCond_cancel(Private_c* priv, mActor_name_t fg_type, u32 cond, +extern u32 mPr_GetPossessionItemSum(Private_c* priv, mActor_name_t item); +extern u32 mPr_GetPossessionItemSumWithCond(Private_c* priv, mActor_name_t item, u32 cond); +extern u32 mPr_GetPossessionItemSumFGTypeWithCond_cancel(Private_c* priv, mActor_name_t fg_type, u32 cond, mActor_name_t cancel_item); -extern int mPr_GetPossessionItemSumItemCategoryWithCond_cancel(Private_c* priv, u8 item1_type, u32 cond, +extern u32 mPr_GetPossessionItemSumItemCategoryWithCond_cancel(Private_c* priv, u8 item1_type, u32 cond, mActor_name_t cancel_item); -extern int mPr_GetPossessionItemSumItemCategoryWithCond(Private_c* priv, u8 item1_type, u32 cond); -extern int mPr_GetPossessionItemSumKindWithCond(Private_c* priv, mActor_name_t kind_start, mActor_name_t kind_end, +extern u32 mPr_GetPossessionItemSumItemCategoryWithCond(Private_c* priv, u8 item1_type, u32 cond); +extern u32 mPr_GetPossessionItemSumKindWithCond(Private_c* priv, mActor_name_t kind_start, mActor_name_t kind_end, u32 cond); extern void mPr_SetItemCollectBit(mActor_name_t item); extern mActor_name_t mPr_DummyPresentToTruePresent(); diff --git a/include/m_submenu_ovl.h b/include/m_submenu_ovl.h index 4227bbfa..dfd55e9e 100644 --- a/include/m_submenu_ovl.h +++ b/include/m_submenu_ovl.h @@ -31,6 +31,9 @@ #include "m_player.h" #include "m_cpmail_ovl_h.h" #include "m_cporiginal_ovl_h.h" +#include "m_haniwa_ovl_h.h" +#include "m_mailbox_ovl_h.h" +#include "m_needlework_ovl_h.h" #ifdef __cplusplus extern "C" { @@ -175,8 +178,8 @@ struct submenu_overlay_s { /* 0x98C */ mED_Ovl_c* editor_ovl; /* 0x990 */ mBD_Ovl_c* board_ovl; /* 0x994 */ mAD_Ovl_c* address_ovl; - /* 0x998 */ void* _998; - /* 0x99C */ void* _99C; + /* 0x998 */ mMB_Ovl_c* mailbox_ovl; + /* 0x99C */ mHW_Ovl_c* haniwa_ovl; /* 0x9A0 */ mTI_Ovl_c* timeIn_ovl; /* 0x9A4 */ mEE_Ovl_c* editEndChk_ovl; /* 0x9A8 */ mWR_Ovl_c* warning_ovl; @@ -189,9 +192,9 @@ struct submenu_overlay_s { /* 0x9C4 */ void* _9C4; /* 0x9C8 */ void* _9C8; /* 0x9CC */ mCL_Ovl_c* catalog_ovl; - /* 0x9D0 */ mMU_Overlay_c* music_ovl; + /* 0x9D0 */ mMU_Ovl_c* music_ovl; /* 0x9D4 */ mBN_Overlay_c* bank_ovl; - /* 0x9D8 */ void* needlework_ovl; + /* 0x9D8 */ mNW_Ovl_c* needlework_ovl; /* 0x9DC */ mCO_Ovl_c* cporiginal_ovl; /* 0x9E0 */ void* _9E0; /* 0x9E4 */ void* _9E4; diff --git a/include/m_tag_ovl.h b/include/m_tag_ovl.h index 068437f0..ba031322 100644 --- a/include/m_tag_ovl.h +++ b/include/m_tag_ovl.h @@ -15,6 +15,39 @@ extern "C" { #define mTG_TAG_FLAG_EDGE_FOOT_SELECT (1 << 0) +#define mTG_MAIL_FLAG_PRESENT (1 << 0) +#define mTG_MAIL_FLAG_RECV (1 << 1) + +enum { + mTG_MARK_CHK, + mTG_MARK_ON, + mTG_MARK_OFF, + mTG_MARK_RVS, + mTG_MARK_CLR, + mTG_MARK_CHK_ALL0, + + mTG_MARK_NUM +}; + +enum { + mTG_MARK_TYPE_NONE, + mTG_MARK_TYPE_INV_FG_ITEM, + mTG_MARK_TYPE_INV_PLAYERROOM_ITEM, + mTG_MARK_TYPE_INV_OTHERROOM_ITEM, + mTG_MARK_TYPE_INV_SELL_ITEM, + mTG_MARK_TYPE_INV_FG_MAIL, + mTG_MARK_TYPE_INV_MAILBOX, + mTG_MARK_TYPE_CPMAIL_MAIL, + mTG_MARK_TYPE_MAILBOX, + mTG_MARK_TYPE_CPMAIL_CPMAIL, + mTG_MARK_TYPE_MUSIC, + mTG_MARK_TYPE_NEEDLEWORK_ORIGINAL, + mTG_MARK_TYPE_CPORIGINAL_ORIGINAL, + + mTG_MARK_TYPE_NUM +}; + + enum { mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT, @@ -175,8 +208,8 @@ struct tag_ovl_s { /* 0x2F2 */ u8 _2F2[0x3C4 - 0x2F2]; }; -extern int mTG_mark_main(Submenu*, mSM_MenuInfo_c*, int, int); -extern int mTG_mark_mainX(Submenu*, mSM_MenuInfo_c*, int, int, int, int); +extern int mTG_mark_main(Submenu*, mSM_MenuInfo_c*, int, int*); +extern int mTG_mark_mainX(Submenu*, mSM_MenuInfo_c*, int, int, int, int*); extern void mTG_tag_ovl_construct(Submenu* submenu); extern void mTG_tag_ovl_destruct(Submenu* submenu); diff --git a/include/m_warning_ovl.h b/include/m_warning_ovl.h index a86f74ca..fa37463e 100644 --- a/include/m_warning_ovl.h +++ b/include/m_warning_ovl.h @@ -31,7 +31,7 @@ enum { mWR_WARNING_5, mWR_WARNING_6, mWR_WARNING_7, - mWR_WARNING_8, + mWR_WARNING_SELL_QUEST_ITEM, mWR_WARNING_PUT_MAX_FURNITURE, mWR_WARNING_PUT_FURNITURE, mWR_WARNING_PUT_ITEM, diff --git a/src/ac_my_room.c b/src/ac_my_room.c index cf152b2d..cd3e5c23 100644 --- a/src/ac_my_room.c +++ b/src/ac_my_room.c @@ -37,7 +37,6 @@ enum { #define aMR_FTR_BANK_NUM 100 #define aMR_FTR_BANK_SIZE 0x800 -#define aMR_CLIP (Common_Get(clip).my_room_clip) #define aMR_BOUNDS_OK(x, z) \ ((x) > (aMR_MIN_BOUND - 1) && (x) < (aMR_MAX_BOUND + 1) && (z) > (aMR_MIN_BOUND - 1) && (z) < (aMR_MAX_BOUND + 1)) diff --git a/src/m_hand_ovl.c b/src/m_hand_ovl.c index 8ad9a644..027dadab 100644 --- a/src/m_hand_ovl.c +++ b/src/m_hand_ovl.c @@ -564,8 +564,8 @@ static void mHD_open_end_proc_item_type6(Submenu* submenu, int idx, int table) { mHD_drop_item(submenu, tag, &Save_Get(homes[menu_info->data1]).haniwa.items[idx].item, NULL); if (flag == TRUE) { submenu->overlay->tag_ovl->item_name_wait_time = 0; - submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, tag->table, mTG_TYPE_HANIWA_PUT_ITEM, 0, tag->pos[0], - tag->pos[1]); + submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, tag->table, mTG_TYPE_HANIWA_PUT_ITEM, 0, tag->base_pos[0], + tag->base_pos[1]); } } diff --git a/src/m_inventory_ovl.c b/src/m_inventory_ovl.c index 59ef3b92..b30d6c55 100644 --- a/src/m_inventory_ovl.c +++ b/src/m_inventory_ovl.c @@ -1274,7 +1274,7 @@ static void mIV_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { 0.0f, 0.0f); tag_ovl->item_name_wait_time = 0; submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_ITEM, mTG_TYPE_QUEST_ITEM, 0, - tag_ovl->tags[0].pos[0], tag_ovl->tags[0].pos[1]); + tag_ovl->tags[0].base_pos[0], tag_ovl->tags[0].base_pos[1]); break; case mSM_IV_OPEN_SEND_MAIL: submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_MAIL, mTG_TYPE_NONE, unselected_num, @@ -1708,10 +1708,10 @@ static void mIV_set_mail(Submenu* submenu, mSM_MenuInfo_c* menu_info, GRAPH* gra int menu_flag; int mark_flag; - if (inv_ovl->remove_timer > 0 && (tag->table == mTG_TABLE_MAIL || inv_ovl->_5E4 == 1)) { - if (inv_ovl->_5E4 == 1) { - select_mask = inv_ovl->_5E2; - } else if (inv_ovl->_5E4 == 0) { + if (inv_ovl->remove_timer > 0 && (tag->table == mTG_TABLE_MAIL || inv_ovl->mail_mark_flag == TRUE)) { + if (inv_ovl->mail_mark_flag == TRUE) { + select_mask = inv_ovl->mail_mark_bitfield2; + } else if (inv_ovl->mail_mark_flag == FALSE) { select_mask = 1 << tag_ovl->get_table_idx_proc(tag); } } @@ -1739,7 +1739,7 @@ static void mIV_set_mail(Submenu* submenu, mSM_MenuInfo_c* menu_info, GRAPH* gra scale = 1.0f; } - if ((inv_ovl->_5E2 & (1 << i)) != 0 && inv_ovl->_5E4 == 0) { + if ((inv_ovl->mail_mark_bitfield2 & (1 << i)) != 0 && inv_ovl->mail_mark_flag == FALSE) { mark_flag = TRUE; } else { mark_flag = FALSE; @@ -2079,9 +2079,9 @@ static void mIV_inventory_ovl_init(Submenu* submenu, mSM_MenuInfo_c* menu_info, inv_ovl->page_order[1] = mIV_PAGE_FISH_COLLECTION; inv_ovl->page_order[2] = mIV_PAGE_INSECT_COLLECTION; inv_ovl->page_move_timer = 0; - inv_ovl->_5E4 = 0; + inv_ovl->mail_mark_flag = FALSE; inv_ovl->item_mark_bitfield = 0; - inv_ovl->_5E2 = 0; + inv_ovl->mail_mark_bitfield2 = 0; inv_ovl->wc_flag = FALSE; if (menu_info->data0 == mSM_IV_OPEN_MAILBOX) { diff --git a/src/m_private.c b/src/m_private.c index e4a55652..aa80240c 100644 --- a/src/m_private.c +++ b/src/m_private.c @@ -436,7 +436,7 @@ extern int mPr_GetPossessionItemIdxKindWithCond(Private_c* priv, mActor_name_t k return idx; } -extern int mPr_GetPossessionItemSum(Private_c* priv, mActor_name_t item) { +extern u32 mPr_GetPossessionItemSum(Private_c* priv, mActor_name_t item) { int sum = 0; if (priv != NULL) { @@ -454,7 +454,7 @@ extern int mPr_GetPossessionItemSum(Private_c* priv, mActor_name_t item) { return sum; } -extern int mPr_GetPossessionItemSumWithCond(Private_c* priv, mActor_name_t item, u32 cond) { +extern u32 mPr_GetPossessionItemSumWithCond(Private_c* priv, mActor_name_t item, u32 cond) { int sum = 0; if (priv != NULL) { @@ -472,7 +472,7 @@ extern int mPr_GetPossessionItemSumWithCond(Private_c* priv, mActor_name_t item, return sum; } -extern int mPr_GetPossessionItemSumFGTypeWithCond_cancel(Private_c* priv, mActor_name_t fg_type, u32 cond, +extern u32 mPr_GetPossessionItemSumFGTypeWithCond_cancel(Private_c* priv, mActor_name_t fg_type, u32 cond, mActor_name_t cancel_item) { int sum = 0; @@ -492,7 +492,7 @@ extern int mPr_GetPossessionItemSumFGTypeWithCond_cancel(Private_c* priv, mActor return sum; } -extern int mPr_GetPossessionItemSumItemCategoryWithCond_cancel(Private_c* priv, u8 item1_type, u32 cond, +extern u32 mPr_GetPossessionItemSumItemCategoryWithCond_cancel(Private_c* priv, u8 item1_type, u32 cond, mActor_name_t cancel_item) { int sum = 0; @@ -512,7 +512,7 @@ extern int mPr_GetPossessionItemSumItemCategoryWithCond_cancel(Private_c* priv, return sum; } -extern int mPr_GetPossessionItemSumItemCategoryWithCond(Private_c* priv, u8 item1_type, u32 cond) { +extern u32 mPr_GetPossessionItemSumItemCategoryWithCond(Private_c* priv, u8 item1_type, u32 cond) { int sum = 0; if (priv != NULL) { @@ -531,7 +531,7 @@ extern int mPr_GetPossessionItemSumItemCategoryWithCond(Private_c* priv, u8 item return sum; } -extern int mPr_GetPossessionItemSumKindWithCond(Private_c* priv, mActor_name_t kind_start, mActor_name_t kind_end, +extern u32 mPr_GetPossessionItemSumKindWithCond(Private_c* priv, mActor_name_t kind_start, mActor_name_t kind_end, u32 cond) { int sum = 0; diff --git a/src/m_soncho.c b/src/m_soncho.c index 3dfdf8dd..7619467b 100644 --- a/src/m_soncho.c +++ b/src/m_soncho.c @@ -377,7 +377,9 @@ static mActor_name_t mSC_Radio_have_taisou_card() { Private_c* priv = Common_Get(now_private); for (i = 0; i < 13; i++) { - if (mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL) > 0) { + int sum = mPr_GetPossessionItemSumWithCond(priv, ITM_EXCERCISE_CARD00 + i, mPr_ITEM_COND_NORMAL); + + if (sum > 0) { return ITM_EXCERCISE_CARD00 + i; } } @@ -550,7 +552,7 @@ extern int mSC_Radio_Set_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor) { msg_no = 0x3423; } - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, + if (mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { @@ -574,7 +576,7 @@ extern int mSC_Radio_Set_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor) { msg_no = 0x342F; } - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, + if (mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { @@ -628,7 +630,7 @@ extern int mSC_Radio_Set_Talk_Proc(TAISOU_NPC0_ACTOR* taisou_actor) { msg_no = 0x342F; } - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, + if (mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { taisou_actor->talk_proc = mSCR_TALK_NEXT; } else { @@ -785,7 +787,7 @@ static void mSCR_talk_before_give(TAISOU_NPC0_ACTOR* taisou_actor, GAME_PLAY* pl mMsg_Window_c* msg_win = mMsg_Get_base_window_p(); if (mMsg_Check_MainNormalContinue(msg_win)) { - if ((u32)mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { + if (mPr_GetPossessionItemSumWithCond(Common_Get(now_private), EMPTY_NO, mPr_ITEM_COND_NORMAL) == 0) { mMsg_Set_continue_msg_num(msg_win, mSC_Radio_msg(taisou_actor, 2)); taisou_actor->talk_proc = mSCR_TALK_9; } else { diff --git a/src/m_tag_ovl.c b/src/m_tag_ovl.c index b4b070e2..6ef5f79a 100644 --- a/src/m_tag_ovl.c +++ b/src/m_tag_ovl.c @@ -12,6 +12,14 @@ #include "_mem.h" #include "m_lib.h" #include "m_item_name.h" +#include "ac_my_room.h" +#include "m_needlework.h" +#include "m_haniwa_ovl.h" +#include "m_player_lib.h" +#include "m_warning_ovl.h" +#include "m_mailbox_ovl.h" +#include "m_music_ovl.h" +#include "m_mark_room.h" static mTG_Ovl_c tag_ovl_data; @@ -21,8 +29,8 @@ typedef struct tag_word_s { } mTG_tag_word_c; typedef struct tag_data_s { - mTG_tag_word_c* words; /* array of words for each line */ - int lines; /* # of lines */ + mTG_tag_word_c** words; /* array of words for each line */ + int lines; /* # of lines */ } mTG_tag_data_c; typedef struct tag_table_data_s { @@ -59,7 +67,6 @@ static s16 mTG_cporiginal_ti_col_pos[] = { 32 }; static s16 mTG_gba_col_pos[] = { -97, -67, -37, -7 }; static s16 mTG_gba_nw_col_pos[] = { 48, 80 }; static s16 mTG_card_col_pos[] = { -45 }; -static s16 mTG_gba_nw_col_pos[] = { 48, 80 }; /* rows */ static s16 mTG_item_line_pos[] = { -10, -34, -58 }; @@ -71,7 +78,6 @@ static s16 mTG_mbox_line_pos[] = { 39, 15, -9, -33, -57 }; static s16 mTG_haniwa_line_pos[] = { 46 }; static s16 mTG_collect_line_pos[] = { 42, 18, -6, -30, -54 }; static s16 mTG_wchange_line_pos[] = { 37, 0, -37 }; -static s16 mTG_mail_line_pos[] = { 38, 14, -10, -34, -58 }; static s16 mTG_cpmail_wc_line_pos[] = { 50, 35, 20, 5, -10, -25, -40, -55 }; static s16 mTG_cpmail_ti_line_pos[] = { 71 }; static s16 mTG_cpedit_line_pos[] = { 50, 18, -14 }; @@ -88,7 +94,6 @@ static s16 mTG_cporiginal_ti_line_pos[] = { 74 }; static s16 mTG_gba_line_pos[] = { 6, -25 }; static s16 mTG_gba_nw_line_pos[] = { 40, 11, -18, -47 }; static s16 mTG_card_line_pos[] = { -10 }; -static s16 mTG_gba_nw_line_pos[] = { 40, 11, -18, -47 }; /* Data table */ static mTG_tag_data_table_c mTG_table_data[] = { @@ -1105,30 +1110,36 @@ static int mTG_check_hand_condition(Submenu* submenu) { } static f32 mTG_set_hand_pos_offset(Submenu* submenu, int table) { + f32 res = 0.0f; + if (submenu->overlay->needlework_ovl != NULL) { int nw_type = submenu->overlay->menu_info[mSM_OVL_NEEDLEWORK].data0; if (nw_type == 0) { - return 21.0f; + res = 21.0f; } else if (nw_type == 1 && table == mTG_TABLE_NEEDLEWORK) { - return 46.0f; + res = 46.0f; } } else if (submenu->overlay->inventory_ovl != NULL) { - if (submenu->overlay->menu_info[mSM_OVL_INVENTORY].data0 == mSM_IV_OPEN_MAILBOX) { - return -155.0f; + if (submenu->overlay->menu_info[mSM_OVL_INVENTORY].data0 == mSM_IV_OPEN_CPMAIL && table == mTG_TABLE_MAIL) { + res = -155.0f; } } - return 0.0f; + return res; } static void mTG_set_hand_pos(Submenu* submenu, f32* pos, int table, int idx) { mTG_tag_data_table_c* data_p = &mTG_table_data[table]; f32 ofs = mTG_set_hand_pos_offset(submenu, table); int col = idx % data_p->col_num; - int row = idx / data_p->col_num; + int row; + f32 pos_x = data_p->col_pos[col]; - pos[0] = data_p->col_pos[col] + ofs; + pos_x += ofs; + pos[0] = pos_x; + + row = idx / data_p->col_num; pos[1] = data_p->row_pos[row]; } @@ -1148,9 +1159,11 @@ static int mTG_get_tag_idx(Submenu* submenu, int type) { return -1; } -static void mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { +static int mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag; int ret_idx = mTG_get_tag_idx(submenu, ret_type); + int i; if (ret_idx >= 0) { if (ret_idx == 0) { @@ -1160,8 +1173,7 @@ static void mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { } if (type == mTG_TYPE_NONE) { - mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; - int i; + tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; for (i = tag_ovl->sel_tag_idx - tag_ovl->ret_tag_idx; i != 0; i--) { tag->base_pos[0] += tag->body_ofs[0]; @@ -1172,36 +1184,41 @@ static void mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { } } } + + return ret_idx; } static u16 mTG_get_item_name_wait_time(mTG_tag_c* tag) { - u16 time = 20; + u16 time; tag->scale = 0.0f; if (tag->table == mTG_TABLE_CATALOG_WC) { time = 16; + } else { + time = 20; } return time; } static void mTG_return_tag_func(Submenu* submenu, mTG_Ovl_c* tag_ovl, mTG_tag_c* tag) { + mTG_tag_c* now_tag = tag; int count = 0; int tag_num = tag_ovl->sel_tag_idx - tag_ovl->ret_tag_idx; int i; - for (i = tag_num; i >= 0; i--) { - tag->scale -= 0.125f; - if (tag->scale <= 0.0f) { - if (tag->type == mTG_TYPE_NONE) { - tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); + for (i = tag_num; i != 0; i--) { + now_tag->scale -= 0.125f; + if (now_tag->scale <= 0.0f) { + if (now_tag->type == mTG_TYPE_NONE) { + tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(now_tag); } - tag->scale = 0.0f; + now_tag->scale = 0.0f; count++; } - tag--; + now_tag--; } if (count == tag_num) { @@ -1335,7 +1352,7 @@ static void mTG_set_tag_win_scale_p(mTG_tag_c* tag, int win_type, f32 x, f32 y) tag->arrow_scale[i] = 1.0f; tag->text_ofs[i] = win_data->_1C[i] + win_data->_24[i] * tag->_04[i] + win_data->_08[i] * tag->body_scale[i]; tag->body_ofs[i] = - arrow_data->ofs[i] + arrow_data->scale[i] * tag->_04[i] + win_data->_08[i] * tag->body_scale[i]; + (arrow_data->ofs[i] + arrow_data->scale[i] * tag->_04[i]) - win_data->_08[i] * tag->body_scale[i]; } } @@ -1359,7 +1376,7 @@ static int mTG_check_edge_right_item(mTG_tag_c* tag) { edge = 92.0f; } - if (tag->base_pos[0] + tag->body_ofs[0] + tag->body_scale[0] * edge >= 146.0f) { + if (tag->base_pos[0] + tag->body_ofs[0] + tag->body_scale[0] * edge <= 146.0f) { res = TRUE; } @@ -1367,28 +1384,32 @@ static int mTG_check_edge_right_item(mTG_tag_c* tag) { } static void mTG_calc_right_edge_select(mTG_tag_c* tag, f32* right_edge) { - f32 margin = tag->body_scale[0] * 122.5f; + f32 margin = tag->body_scale[0] * 122.5f * 0.5f; - *right_edge = margin * 0.5 + tag->base_pos[0] + tag->body_ofs[0]; + *right_edge = tag->base_pos[0] + tag->body_ofs[0] + margin; } static int mTG_check_edge_right_select(mTG_tag_c* tag, f32* right_edge) { - f32 margin = tag->body_scale[0] * 122.5f; + f32 margin = tag->body_scale[0] * 122.5f * 0.5f; + int res = FALSE; - *right_edge = (margin * 0.5 + tag->base_pos[0] + tag->body_ofs[0]) - 134.0f; + *right_edge = (tag->base_pos[0] + tag->body_ofs[0] + margin) - 134.0f; if (*right_edge <= 0.0f) { - return TRUE; + res = TRUE; } - return FALSE; + return res; } static int mTG_check_edge_foot_select(mTG_tag_c* tag) { + f32 margin = (tag->body_scale[1] * 129.5f) * 0.5f; + f32 tmp; int res = FALSE; + tmp = (tag->base_pos[1] + tag->body_ofs[1]) - margin; tag->flags &= ~mTG_TAG_FLAG_EDGE_FOOT_SELECT; - if ((tag->base_pos[1] + tag->body_ofs[1]) - (tag->body_scale[1] * 129.5f) * 0.5f - 3.0f >= -120.0f) { + if (tmp - 3.0f >= -120.0f) { tag->flags |= mTG_TAG_FLAG_EDGE_FOOT_SELECT; res = TRUE; } @@ -1396,16 +1417,16 @@ static int mTG_check_edge_foot_select(mTG_tag_c* tag) { return res; } -static int mTG_get_max_col_width_data(mTG_tag_word_c* tag_word, int lines) { +static int mTG_get_max_col_width_data(mTG_tag_word_c** tag_word, int lines) { int max_col_width = 0; int i; if (tag_word != NULL) { for (i = 0; i < lines; i++) { - int len = mMl_strlen(tag_word[i].str, mTG_TAG_STR_LEN, CHAR_SPACE); - int width = mFont_GetStringWidth(tag_word[i].str, len, TRUE); + int len = mMl_strlen(tag_word[i]->str, mTG_TAG_STR_LEN, CHAR_SPACE); + int width = mFont_GetStringWidth(tag_word[i]->str, len, TRUE); - if (max_col_width < width) { + if (width > max_col_width) { max_col_width = width; } } @@ -1433,7 +1454,7 @@ static void mTG_get_col_width_and_line_select(mTG_tag_c* tag, mTG_tag_data_c* ta *max_height = (f32)(tag_data->lines + 1) * 16.0f; width = mFont_GetStringWidth(mTG_tag_str_suteruno, sizeof(mTG_tag_str_suteruno), TRUE); - if (*max_width < width) { + if (width > *max_width) { *max_width = width; } break; @@ -1489,7 +1510,7 @@ static int mTG_strcat(u8* str0, u8* str1, int str0_max, int str1_max) { int str0_len = mMl_strlen(str0, str0_max, CHAR_SPACE); int str1_len = mMl_strlen(str1, str1_max, CHAR_SPACE); - if (str0_max < (str0_len + str1_len)) { + if ((str0_len + str1_len) > str0_max) { str1_len -= (str0_len + str1_len) - str0_max; } @@ -1524,16 +1545,15 @@ static int mTG_strcat_color(u8* str, u8* src, int str_max, int src_max, rgba_t* if ((str_max - src_len) - str_len > 1) { int col_len = mTG_strcat(str, font_color_base, str_max, sizeof(font_color_base)); - if (str_max < (col_len + src_len)) { + if ((col_len + src_len) > str_max) { src_len -= (col_len + src_len) - str_max; } - str += col_len; - str[-4] = color->r; - str[-3] = color->g; - str[-2] = color->b; - str[-1] = (u8)src_len; - memcpy(str, src, src_len); + str[col_len - 4] = color->r; + str[col_len - 3] = color->g; + str[col_len - 2] = color->b; + str[col_len - 1] = (u8)src_len; + memcpy(str + col_len, src, src_len); str_len = col_len + src_len; } @@ -1592,10 +1612,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_mail(mTG_tag_c* tag, mTG_str } static int mTG_init_tag_data_item_win_sub_mail_item_xmas(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { - u8* src; - - src = mNpc_GetNpcWorldNameP(SP_NPC_SANTA); - mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_SANTA), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; tag->str2_type = 5; @@ -1604,10 +1621,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_xmas(mTG_tag_c* tag, mTG_str } static int mTG_init_tag_data_item_win_sub_mail_item_tanukiti(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { - u8* src; - - src = mNpc_GetNpcWorldNameP(SP_NPC_SHOP_MASTER); - mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_SHOP_MASTER), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; tag->str2_type = 6; @@ -1616,10 +1630,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_tanukiti(mTG_tag_c* tag, mTG } static int mTG_init_tag_data_item_win_sub_mail_item_tunekiti(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { - u8* src; - - src = mNpc_GetNpcWorldNameP(SP_NPC_BROKER); - mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_BROKER), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; tag->str2_type = 6; @@ -1637,10 +1648,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_mother(mTG_tag_c* tag, mTG_s } static int mTG_init_tag_data_item_win_sub_mail_item_omikuji(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { - u8* src; - - src = mNpc_GetNpcWorldNameP(SP_NPC_EV_MIKO); - mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_EV_MIKO), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; tag->str2_type = 9; @@ -1658,10 +1666,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_happy(mTG_tag_c* tag, mTG_st } static int mTG_init_tag_data_item_win_sub_mail_item_snowman(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { - u8* src; - - src = mNpc_GetNpcWorldNameP(ETC_SNOWMAN_BALL_A); - mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(ETC_SNOWMAN_BALL_A), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; tag->str2_type = 5; @@ -1670,10 +1675,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_snowman(mTG_tag_c* tag, mTG_ } static int mTG_init_tag_data_item_win_sub_mail_item_angler(mTG_tag_c* tag, mTG_str_info_c* str_infos, Mail_c* mail) { - u8* src; - - src = mNpc_GetNpcWorldNameP(SP_NPC_ANGLER); - mTG_strcpy(str_infos[1].str, src, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); + mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_ANGLER), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; tag->str2_type = 8; @@ -1869,15 +1871,16 @@ static void mTG_init_tag_data_item_win_sub_mail_item(Submenu* submenu, mTG_tag_c f32 str1_width = mFont_GetStringWidth2(tag->str1, str1_len, TRUE); f32 str2_width = mFont_GetStringWidth2(tag->str2, str2_len, TRUE); - if (width < str1_width) { + if (str1_width > width) { width = str1_width; } - if (width < str2_width) { + if (str2_width > width) { width = str2_width; } - mTG_set_tag_win_scale_p(tag, win_type, width * scale, 0.0f); + width *= scale; + mTG_set_tag_win_scale_p(tag, win_type, width, 0.0f); } if (win_type == mTG_WIN_TYPE_SELECT && mTG_quest_disp_up_check(tag) == FALSE && @@ -1931,11 +1934,12 @@ static void mTG_init_tag_data_set_itemNo(mActor_name_t* itemNo, Mail_c** mail_pp case mTG_TABLE_HANIWA: *itemNo = Save_Get(homes[submenu->overlay->menu_info[mSM_OVL_HANIWA].data1]).haniwa.items[idx].item; break; - case mTG_TABLE_COLLECT: + case mTG_TABLE_COLLECT: { mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; *itemNo = inv_ovl->set_collect_itemNo_proc(idx, inv_ovl->page_order[0]); break; + } case mTG_TABLE_MAIL: case mTG_TABLE_MBOX: case mTG_TABLE_CPMAIL: @@ -2011,8 +2015,7 @@ static void mTG_init_tag_data_needlework_win(Submenu* submenu, int idx) { tag->str2_type = 0; if (tag->table == mTG_TABLE_CPORIGINAL) { - int top = mCO_top_folder(submenu); - int hide = mCO_check_hide_flg(submenu, top, idx); + int hide = mCO_check_hide_flg(submenu, mCO_top_folder(submenu), idx); if (hide) { tag->arrow_dir = 0; @@ -2120,9 +2123,9 @@ static void mTG_init_tag_data_select_win_only(mTG_tag_c* tag, mTG_tag_data_c* da { -0.875f, -26.25f }, }; + f32 dist_right; f32 max_width; f32 max_height; - f32 dist_right; int edge_right; int edge_foot; f32* min_ofs_p; @@ -2162,7 +2165,7 @@ static void mTG_init_tag_data_select_win_only(mTG_tag_c* tag, mTG_tag_data_c* da ofs_dis_p = other_arrow_offset_dis[idx]; tag->body_ofs[0] = min_ofs_p[0] + ofs_dis_p[0] * tag->_04[0] + tag->body_scale[0] * 61.25f * dir_x; - tag->body_ofs[1] = min_ofs_p[1] + ofs_dis_p[1] * tag->_04[1] + (tag->body_scale[1] * 61.25f - 6.0f) * dir_y; + tag->body_ofs[1] = min_ofs_p[1] + ofs_dis_p[1] * tag->_04[1] + (tag->body_scale[1] * 64.75f - 6.0f) * dir_y; } typedef struct add_item_data_s { @@ -2193,29 +2196,31 @@ static void mTG_init_tag_data_select_win_after_item(mTG_tag_c* tag, mTG_tag_c* i }; // clang-format on + int left_flag; mTG_add_item_data_c* data_p; - f32 max_width; - f32 max_height; f32 scale_x; f32 scale_y; - int left_flag; + f32 dist_right; + f32 max_width; + f32 max_height; + int tmp; + int idx; mTG_get_col_width_and_line_select(tag, tag_data, &max_width, &max_height); mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_SELECT2, max_width * 0.875f, max_height * 0.875f); + left_flag = FALSE; if (item_tag->body_ofs[0] < 0.0f) { left_flag = TRUE; - } else { - left_flag = FALSE; } if (item_tag->str2_type != 0) { - scale_y = 68.0f; - scale_x = 184.0f; + scale_x = 68.0f; + scale_y = 184.0f; data_p = &tag_add_item_data[1]; } else { - scale_y = 28.0f; - scale_x = 129.5f; + scale_x = 28.0f; + scale_y = 129.5f; data_p = &tag_add_item_data[0]; } @@ -2226,5 +2231,2402 @@ static void mTG_init_tag_data_select_win_after_item(mTG_tag_c* tag, mTG_tag_c* i tag->base_pos[0] += item_tag->body_ofs[0] - item_tag->body_scale[0] * scale_x * 0.5f; tag->body_ofs[0] = tag->body_scale[0] * 122.5f * 0.5f; - // TODO + tmp = mTG_check_edge_foot_select(tag); + if (tmp && item_tag->table == mTG_TABLE_ITEM && item_tag->tag_row == 1 && mTG_label_table[tag->type].lines == 2) { + tmp = FALSE; + } + + if (tmp) { + tag->base_pos[0] += data_p->down_min[0][0] + item_tag->_04[0] * data_p->down_min[1][0]; + tag->body_ofs[0] += data_p->up_min[0][0] + tag->_04[0] * data_p->up_min[1][0]; + mTG_calc_right_edge_select(tag, &dist_right); + + idx = 0; + if (dist_right >= 131.0f) { + if (dist_right >= 167.0f) { + idx = 2; + } else { + idx = 1; + } + } + + if (idx == 2 || left_flag) { + f32 xofs; + + tag->base_pos[0] = + (item_tag->base_pos[0] + item_tag->body_ofs[0] + item_tag->body_scale[0] * scale_x * 0.5f) - + (data_p->down_min[0][0] + item_tag->_04[0] * data_p->down_min[1][0]); + tag->body_ofs[0] = + -(tag->body_scale[0] * 122.5f * 0.5f) - (data_p->up_min[0][0] + tag->_04[0] * data_p->up_min[1][0]); + xofs = (tag->base_pos[0] + tag->body_ofs[0] - tag->body_scale[0] * 122.5f * 0.5f) - -134.0f; + + if (xofs < 0.0f) { + tag->body_ofs[0] -= xofs; + } + } else if (idx == 1) { + tag->base_pos[0] -= (dist_right - 131.0f); + } + } else { + f32 yofs; + + tag->base_pos[1] = item_tag->base_pos[1] + item_tag->body_ofs[1] + item_tag->body_scale[1] * scale_y * 0.5f + + data_p->down_ofs[0][1] + item_tag->_04[1] * data_p->down_ofs[1][1]; + tag->body_ofs[1] = + (tag->body_scale[1] * 129.5f * 0.5f) + (data_p->up_ofs[0][1] + tag->_04[1] * data_p->up_ofs[1][1]); + yofs = (tag->base_pos[1] + tag->body_ofs[1] + tag->body_scale[1] * 129.5f * 0.5f); + + if (yofs > 120.0f) { + tag->base_pos[1] -= yofs - 120.0f; + } + + tag->base_pos[0] += data_p->down_ofs[0][0] + item_tag->_04[0] * data_p->down_ofs[1][0]; + tag->body_ofs[0] += data_p->up_ofs[0][0] + tag->_04[0] * data_p->up_ofs[1][0]; + + mTG_calc_right_edge_select(tag, &dist_right); + + idx = 0; + if (dist_right >= 131.0f) { + if (dist_right >= 167.0f) { + idx = 2; + } else { + idx = 1; + } + } + + if (idx == 2 || left_flag) { + f32 xofs; + + tag->base_pos[0] = + (item_tag->base_pos[0] + item_tag->body_ofs[0] + item_tag->body_scale[0] * scale_x * 0.5f) - + (data_p->down_ofs[0][0] + item_tag->_04[0] * data_p->down_ofs[1][0]); + tag->body_ofs[0] = + -(tag->body_scale[0] * 122.5f * 0.5f) - (data_p->up_ofs[0][0] + tag->_04[0] * data_p->up_ofs[1][0]); + xofs = (tag->base_pos[0] + tag->body_ofs[0] - tag->body_scale[0] * 122.5f * 0.5f) - -134.0f; + + if (xofs < 0.0f) { + tag->body_ofs[0] -= xofs; + } + } else if (idx == 1) { + tag->base_pos[0] -= (dist_right - 131.0f); + } + } + + tag->arrow_dir = 0; +} + +static void mTG_init_tag_data_select_win_after_select(mTG_tag_c* tag, mTG_tag_c* parent_tag, mTG_tag_data_c* tag_data) { + f32 dist_right; + f32 line; + f32 col; + f32 pos; + + mTG_get_col_width_and_line_select(tag, tag_data, &col, &line); + mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_SELECT2, col * 0.875f, line * 0.875f); + tag->arrow_dir = 0; + pos = tag->base_pos[1]; + + tag->base_pos[0] += tag->_04[0] * -0.875f + -0.875f; + tag->base_pos[1] += tag->_04[1] * 8.75f + 6.125f; + tag->base_pos[1] -= 7.0f; + tag->body_ofs[0] = tag->body_scale[0] * 61.25f; + tag->body_ofs[1] = tag->body_scale[1] * -64.75f; + + if (mTG_check_edge_right_select(tag, &dist_right) == FALSE) { + tag->body_ofs[0] -= dist_right; + } + + if (mTG_check_edge_foot_select(tag) == FALSE) { + f32 tmp; + + tag->body_ofs[1] *= -1.0f; + tag->base_pos[1] = pos - (tag->_04[1] * 8.75f + 6.125f); + tag->base_pos[1] += 7.0f; + + tmp = tag->body_scale[1] * 129.5f * 0.5f + (tag->base_pos[1] + tag->body_ofs[1]); + if (tmp > 120.0f) { + tag->base_pos[1] -= tmp - 120.0f; + } + } +} + +static void mTG_init_tag_data(Submenu* submenu, int table, int type, f32 base_x, f32 base_y, int idx_x, int idx_y) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_data_c* tag_data = &mTG_label_table[type]; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + mTG_tag_c* item_tag = &tag_ovl->tags[0]; + mTG_tag_c* parent_tag; + + if (tag_ovl->sel_tag_idx > 0) { + parent_tag = &tag_ovl->tags[tag_ovl->sel_tag_idx - 1]; + } else { + parent_tag = NULL; + } + + tag->type = type; + tag->table = table; + tag->tag_col = idx_x; + tag->tag_row = idx_y; + tag->scale = 0.0f; + + if (tag_ovl->sel_tag_idx == 0) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + int table_idx = mTG_get_table_idx(item_tag); + + hand_ovl->info.type = 1; + mTG_init_tag_data_item_win(submenu); + mTG_set_hand_pos(submenu, hand_ovl->info.pos, item_tag->table, table_idx); + } else { + tag->base_pos[0] = base_x; + tag->base_pos[1] = base_y; + + if (tag_ovl->sel_tag_idx == 1) { + if (item_tag->arrow_dir != 0) { + mTG_init_tag_data_select_win_after_item(tag, item_tag, tag_data); + } else { + mTG_init_tag_data_select_win_only(tag, tag_data); + } + } else { + mTG_init_tag_data_select_win_after_select(tag, parent_tag, tag_data); + } + } +} + +static void mTG_chg_tag_func(Submenu* submenu, int table, int type, int idx, f32 base_x, f32 base_y) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_data_table_c* data_table = &mTG_table_data[table]; + int idx_x; + int idx_y; + + idx_y = idx / data_table->col_num; + idx_x = idx - (idx_y * data_table->col_num); + + if (tag_ovl->sel_tag_idx < 3) { + tag_ovl->sel_tag_idx++; + tag_ovl->ret_tag_idx = tag_ovl->sel_tag_idx; + mTG_init_tag_data(submenu, table, type, base_x, base_y, idx_x, idx_y); + } +} + +static void mTG_chg_tag_func2(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag, int type) { + // clang-format off + mTG_chg_tag_func( + submenu, + tag->table, + type, + 0, + tag->base_pos[0] + menu_info->position[0] + (tag->body_ofs[0] + tag->text_ofs[0] + -3.5f), + tag->base_pos[1] + menu_info->position[1] + ((tag->body_ofs[1] + tag->text_ofs[1] - tag->tag_row * 16.0f) - 8.0f) * 0.875f + ); + // clang-format on +} + +static int mTG_check_item_on_mail(mActor_name_t item, int cond) { + int res = TRUE; + + if (cond != mPr_ITEM_COND_NORMAL || + ((item >= ITM_EXCERCISE_CARD00 && item <= ITM_EXCERCISE_CARD12) || item == ITM_KNIFE_AND_FORK)) { + res = FALSE; + } else if (ITEM_IS_ITEM1(item)) { + int cat = ITEM_NAME_GET_CAT(item); + + if (cat == ITEM1_CAT_KABU || cat == ITEM1_CAT_FISH || cat == ITEM1_CAT_INSECT) { + res = FALSE; + } + } + + return res; +} + +static int mTG_check_put_unit(xyz_t* pos_p) { + GAME_PLAY* play = (GAME_PLAY*)gamePT; + int ux; + int uz; + int res = TRUE; + + mFI_Wpos2UtNum(&ux, &uz, *pos_p); + + if (mRlib_snowman_ball_unit_check_from_pos(play, pos_p)) { + res = FALSE; + } else if (mCoBG_CheckAcceptDesignSign(pos_p) == FALSE) { + res = FALSE; + } else { + mCoBG_Collision_u* col = mFI_UtNum2UtCol(ux, uz); + + if (mCoBG_GetHoleNumber_ClData(col) > 0) { + res = FALSE; + } + } + + return res; +} + +static int mTG_put_place_check(xyz_t* pos_p, int plant_flag, int unit_flag) { + int res = TRUE; + + if (unit_flag) { + res = mTG_check_put_unit(pos_p); + } + + if (res == TRUE) { + if (plant_flag) { + if (mCoBG_CheckPlant(*pos_p) == -1) { + res = FALSE; + } + } else { + res = mCoBG_CheckPlace(*pos_p); + } + } + + return res; +} + +static void mTG_check_direction_put_pos(int* dir_p) { + if (*dir_p < 0) { + (*dir_p) += 8; + } else if (*dir_p >= 8) { + (*dir_p) -= 8; + } +} + +static int mTG_check_wall_put_pos(const xyz_t* start_pos_p, const xyz_t* end_pos_p) { + mCoBG_Check_c bg_check; + int res = FALSE; + + bg_check.result.hit_wall = 0; + bg_check.result.hit_attribute_wall = 0; + + mCoBG_VirtualBGCheck(NULL, &bg_check, start_pos_p, end_pos_p, 0, FALSE, TRUE, 10.0f, -20.0f, 1, 1, 0); + if (bg_check.result.hit_wall != 0 || bg_check.result.hit_attribute_wall != 0) { + res = TRUE; + } + + return res; +} + +static int mTG_check_pos_slope(xyz_t* pos_p) { + // clang-format off + static f32 offset_pos[][2] = { + { 0.0f, mFI_UT_WORLDSIZE_Z_F }, + { mFI_UT_WORLDSIZE_X_F, mFI_UT_WORLDSIZE_Z_F }, + { mFI_UT_WORLDSIZE_X_F, 0.0f }, + { mFI_UT_WORLDSIZE_X_F, -mFI_UT_WORLDSIZE_Z_F }, + { 0.0f, -mFI_UT_WORLDSIZE_Z_F }, + { -mFI_UT_WORLDSIZE_X_F, -mFI_UT_WORLDSIZE_Z_F }, + { -mFI_UT_WORLDSIZE_X_F, 0.0f }, + { -mFI_UT_WORLDSIZE_X_F, mFI_UT_WORLDSIZE_Z_F }, + }; + // clang-format on + + int res = TRUE; + int i; + + for (i = 0; i < 8; i++) { + xyz_t pos; + mCoBG_Collision_u* col; + + pos.x = pos_p->x + offset_pos[i][0]; + pos.z = pos_p->z + offset_pos[i][1]; + pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f); + + col = mFI_GetUnitCol(pos); + if (mCoBG_GetHoleNumber_ClData(col) > 0 || pos_p->y != pos.y) { + res = FALSE; + break; + } + } + + return res; +} + +// clang-format off +#define mTG_SEARCH_BAD_ITEM(item) ( \ + (item) == TREE_S0 || \ + (item) == TREE_S1 || \ + (item) == TREE_S2 || \ + (item) == TREE || \ + (item) == TREE_1000BELLS_S0 || \ + (item) == TREE_1000BELLS_S1 || \ + (item) == TREE_1000BELLS_S2 || \ + (item) == TREE_1000BELLS || \ + (item) == TREE_10000BELLS_S0 || \ + (item) == TREE_10000BELLS_S1 || \ + (item) == TREE_10000BELLS_S2 || \ + (item) == TREE_10000BELLS || \ + (item) == TREE_30000BELLS_S0 || \ + (item) == TREE_30000BELLS_S1 || \ + (item) == TREE_30000BELLS_S2 || \ + (item) == TREE_30000BELLS || \ + (item) == TREE_100BELLS_S0 || \ + (item) == TREE_100BELLS_S1 || \ + (item) == TREE_100BELLS_S2 || \ + (item) == TREE_100BELLS || \ + (item) == CEDAR_TREE_S0 || \ + (item) == CEDAR_TREE_S1 || \ + (item) == CEDAR_TREE_S2 || \ + (item) == CEDAR_TREE || \ + (item) == GOLD_TREE_S0 || \ + (item) == GOLD_TREE_S1 || \ + (item) == GOLD_TREE_S2 || \ + (item) == GOLD_TREE || \ + (item) == GOLD_TREE_SHOVEL || \ + (item) == TREE_APPLE_S0 || \ + (item) == TREE_APPLE_S1 || \ + (item) == TREE_APPLE_S2 || \ + (item) == TREE_APPLE_NOFRUIT_0 || \ + (item) == TREE_APPLE_NOFRUIT_1 || \ + (item) == TREE_APPLE_NOFRUIT_2 || \ + (item) == TREE_APPLE_FRUIT || \ + (item) == TREE_ORANGE_S0 || \ + (item) == TREE_ORANGE_S1 || \ + (item) == TREE_ORANGE_S2 || \ + (item) == TREE_ORANGE_NOFRUIT_0 || \ + (item) == TREE_ORANGE_NOFRUIT_1 || \ + (item) == TREE_ORANGE_NOFRUIT_2 || \ + (item) == TREE_ORANGE_FRUIT || \ + (item) == TREE_PEACH_S0 || \ + (item) == TREE_PEACH_S1 || \ + (item) == TREE_PEACH_S2 || \ + (item) == TREE_PEACH_NOFRUIT_0 || \ + (item) == TREE_PEACH_NOFRUIT_1 || \ + (item) == TREE_PEACH_NOFRUIT_2 || \ + (item) == TREE_PEACH_FRUIT || \ + (item) == TREE_PEAR_S0 || \ + (item) == TREE_PEAR_S1 || \ + (item) == TREE_PEAR_S2 || \ + (item) == TREE_PEAR_NOFRUIT_0 || \ + (item) == TREE_PEAR_NOFRUIT_1 || \ + (item) == TREE_PEAR_NOFRUIT_2 || \ + (item) == TREE_PEAR_FRUIT || \ + (item) == TREE_CHERRY_S0 || \ + (item) == TREE_CHERRY_S1 || \ + (item) == TREE_CHERRY_S2 || \ + (item) == TREE_CHERRY_NOFRUIT_0 || \ + (item) == TREE_CHERRY_NOFRUIT_1 || \ + (item) == TREE_CHERRY_NOFRUIT_2 || \ + (item) == TREE_CHERRY_FRUIT || \ + (item) == TREE_PALM_S0 || \ + (item) == TREE_PALM_S1 || \ + (item) == TREE_PALM_S2 || \ + (item) == TREE_PALM_NOFRUIT_0 || \ + (item) == TREE_PALM_NOFRUIT_1 || \ + (item) == TREE_PALM_NOFRUIT_2 || \ + (item) == TREE_PALM_FRUIT || \ + (item) == TREE_BEES || \ + (item) == TREE_FTR || \ + (item) == TREE_LIGHTS || \ + (item) == TREE_PRESENT || \ + (item) == TREE_BELLS || \ + (item) == CEDAR_TREE_BELLS || \ + (item) == CEDAR_TREE_FTR || \ + (item) == CEDAR_TREE_BEES || \ + (item) == GOLD_TREE_BELLS || \ + (item) == GOLD_TREE_FTR || \ + (item) == GOLD_TREE_BEES || \ + (item) == CEDAR_TREE_LIGHTS || \ + ITEM_IS_HOLE((item)) || \ + (item) == HOLE_SHINE || \ + IS_ITEM_TREE_STUMP((item)) \ +) +// clang-format on + +static int mTG_search_put_pos2(ACTOR* player_actor, xyz_t* pos_tbl, int plant_flag, int param_4, int num_pos, + int param_6, int unit_flag, int param_8) { + // clang-format off + static f32 offset_pos[][2] = { + { 0.0f, mFI_UT_WORLDSIZE_Z_F }, + { mFI_UT_WORLDSIZE_X_F, mFI_UT_WORLDSIZE_Z_F }, + { mFI_UT_WORLDSIZE_X_F, 0.0f }, + { mFI_UT_WORLDSIZE_X_F, -mFI_UT_WORLDSIZE_Z_F }, + { 0.0f, -mFI_UT_WORLDSIZE_Z_F }, + { -mFI_UT_WORLDSIZE_X_F, -mFI_UT_WORLDSIZE_Z_F }, + { -mFI_UT_WORLDSIZE_X_F, 0.0f }, + { -mFI_UT_WORLDSIZE_X_F, mFI_UT_WORLDSIZE_Z_F }, + }; + // clang-format on + xyz_t pos; + xyz_t center_pos; + xyz_t pos2; + xyz_t start_pos; + int unit; + int next_unit; + mActor_name_t* fg_p; + s16 player_angle_y; + int max; + int i; + int count; + + pos2.x = player_actor->world.position.x; + pos2.z = player_actor->world.position.z; + pos2.y = player_actor->world.position.y; + count = 0; + + mFI_Wpos2UtCenterWpos(¢er_pos, pos2); + center_pos.y = mCoBG_Wpos2BgUtCenterHeight_AddColumn(center_pos); + fg_p = mFI_GetUnitFG(center_pos); + + if (param_6 == 0 && param_4 == 0 && fg_p != NULL && *fg_p == EMPTY_NO && + mTG_put_place_check(¢er_pos, plant_flag, unit_flag)) { + xyz_t_move(pos_tbl, ¢er_pos); + pos_tbl++; + count = 1; + } + + player_angle_y = player_actor->shape_info.rotation.y; + + if (player_angle_y > DEG2SHORT_ANGLE2(157.5f) || player_angle_y <= DEG2SHORT_ANGLE2(-157.5f)) { + unit = 4; + } else if (player_angle_y > DEG2SHORT_ANGLE2(112.5f)) { + unit = 3; + } else if (player_angle_y > DEG2SHORT_ANGLE2(67.5f)) { + unit = 2; + } else if (player_angle_y > DEG2SHORT_ANGLE2(22.5f)) { + unit = 1; + } else if (player_angle_y > DEG2SHORT_ANGLE2(-22.5f)) { + unit = 0; + } else if (player_angle_y > DEG2SHORT_ANGLE2(-67.5f)) { + unit = 7; + } else if (player_angle_y > DEG2SHORT_ANGLE2(-112.5f)) { + unit = 6; + } else { + unit = 5; + } + + max = param_8 ? 5 : 8; + for (i = 0; i < max && count < num_pos; i++) { + mActor_name_t* fg_p; + + if (i & 1) { + unit += i; + } else { + unit -= i; + } + + mTG_check_direction_put_pos(&unit); + pos.x = center_pos.x + offset_pos[unit][0]; + pos.z = center_pos.z + offset_pos[unit][1]; + pos.y = mCoBG_Wpos2BgUtCenterHeight_AddColumn(pos); + + fg_p = mFI_GetUnitFG(pos); + if (fg_p != NULL && *fg_p == EMPTY_NO && mTG_put_place_check(&pos, plant_flag, unit_flag) && + (unit_flag == FALSE || (unit_flag != FALSE && mTG_check_pos_slope(&pos)))) { + start_pos = player_actor->world.position; + start_pos.y -= 20.0f; + + if ((unit & 1)) { + mActor_name_t* fg_p; + + next_unit = unit + 1; + mTG_check_direction_put_pos(&next_unit); + + pos2.x = center_pos.x + offset_pos[next_unit][0]; + pos2.z = center_pos.z + offset_pos[next_unit][1]; + pos2.y = mCoBG_Wpos2BgUtCenterHeight_AddColumn(pos2); + + fg_p = mFI_GetUnitFG(pos2); + if (fg_p != NULL && !mTG_SEARCH_BAD_ITEM(*fg_p) && mTG_check_wall_put_pos(&start_pos, &pos2) == FALSE && + mTG_check_wall_put_pos(&pos2, &pos) == FALSE) { + xyz_t_move(pos_tbl, &pos); + count++; + pos_tbl++; + } else { + next_unit = unit - 1; + mTG_check_direction_put_pos(&next_unit); + + pos2.x = center_pos.x + offset_pos[next_unit][0]; + pos2.z = center_pos.z + offset_pos[next_unit][1]; + pos2.y = mCoBG_Wpos2BgUtCenterHeight_AddColumn(pos2); + + fg_p = mFI_GetUnitFG(pos2); + if (fg_p != NULL && !mTG_SEARCH_BAD_ITEM(*fg_p) && + mTG_check_wall_put_pos(&start_pos, &pos2) == FALSE && + mTG_check_wall_put_pos(&pos2, &pos) == FALSE) { + xyz_t_move(pos_tbl, &pos); + count++; + pos_tbl++; + } + } + } else { + if (mTG_check_wall_put_pos(&start_pos, &pos) == FALSE) { + xyz_t_move(pos_tbl, &pos); + count++; + pos_tbl++; + } + } + } + } + + return count; +} + +static int mTG_search_put_pos(ACTOR* player_actor, xyz_t* pos_tbl, int plant_flag, int param_4, int param_5, + int unit_flag, int param_7) { + return mTG_search_put_pos2(player_actor, pos_tbl, plant_flag, param_4, 1, param_5, unit_flag, param_7); +} + +static void mTG_open_warning_window(Submenu* submenu, mSM_MenuInfo_c* menu_info, int type) { + mSM_open_submenu(submenu, mSM_OVL_WARNING, type, 0); + menu_info->proc_status = mSM_OVL_PROC_WAIT; + menu_info->next_proc_status = mSM_OVL_PROC_WAIT; + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + sAdo_SysTrgStart(MONO(NA_SE_3)); +} + +static int mTG_common_throw_put_field(GAME_PLAY* play, mActor_name_t item, xyz_t* pos_p, s16 layer) { + int res = FALSE; + + if (item == ITM_SIGNBOARD) { + res = aSIGN_set_white_sign(&play->game, pos_p); + } else { + int ux; + int uz; + + if (mFI_Wpos2UtNum(&ux, &uz, *pos_p) && Common_Get(clip).bg_item_clip != NULL && + Common_Get(clip).bg_item_clip->player_drop_entry_proc != NULL) { + res = Common_Get(clip).bg_item_clip->player_drop_entry_proc(&play->game, item, ux, uz, layer); + } + } + + return res; +} + +static int mTG_common_throw_put_room(GAME_PLAY* play, mActor_name_t item, xyz_t* pos_p, int layer, int delay_timer) { + int ux; + int uz; + int res = FALSE; + + if (mFI_Wpos2UtNum(&ux, &uz, *pos_p) && Common_Get(clip).shop_goods_clip != NULL && + Common_Get(clip).shop_goods_clip->player_drop_entry_proc != NULL) { + res = Common_Get(clip).shop_goods_clip->player_drop_entry_proc(&play->game, item, ux, uz, layer, delay_timer); + } + + return res; +} + +static void mTG_close_window(Submenu* submenu, mSM_MenuInfo_c* menu_info, int se_flag) { + submenu->overlay->move_chg_base_proc(menu_info, mSM_OVL_PROC_MOVE); + if (se_flag) { + sAdo_SysTrgStart(NA_SE_31); + } +} + +static void mTG_open_board_init(Submenu* submenu, mSM_MenuInfo_c* menu_info, int mail_idx, int type, int item_idx) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* item_tag = &tag_ovl->tags[0]; + Mail_c* mail; + + if (mail_idx == -1) { + mail = mTG_get_mail_pointer(submenu, NULL); + } else { + mail = &Now_Private->mail[mail_idx]; + } + + tag_ovl->sel_tag_idx = 0; + tag_ovl->ret_tag_idx = 0; + tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(item_tag); + + mSM_open_submenu_new(submenu, mSM_OVL_BOARD, type, item_idx, mail); + + menu_info->proc_status = mSM_OVL_PROC_MOVE; + menu_info->next_proc_status = mSM_OVL_PROC_WAIT; + menu_info->move_drt = mSM_MOVE_OUT_LEFT; + sAdo_SysTrgStart(NA_SE_5F); +} + +static void mTG_set_catch_se(Submenu* submenu) { + if (submenu->overlay->tag_ovl->sel_tag_idx == 0) { + sAdo_SysTrgStart(NA_SE_33); + } else { + sAdo_SysTrgStart(NA_SE_33); + } +} + +static void mTG_catch_item_from_table(Submenu* submenu, Mail_c* mail, mActor_name_t* item, int item_cond, int table, + int table_idx) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + if (table == mTG_TABLE_PLAYER) { + hand_ovl->info.wait_timer = 16; + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_CATCH; + } else if (table == mTG_TABLE_NEEDLEWORK || table == mTG_TABLE_CPORIGINAL_NW) { + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.hold_tbl = table; + hand_ovl->info.hold_idx = table_idx; + hand_ovl->info.item = *item; + hand_ovl->info.item_cond = item_cond; + *item = EMPTY_NO; + mNW_on_hide_flg(submenu, table_idx); + } else if (table == mTG_TABLE_CPORIGINAL) { + int top = mCO_top_folder(submenu); + + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.hold_tbl = table; + hand_ovl->info.hold_idx = table_idx; + hand_ovl->info.item = *item; + hand_ovl->info.item_cond = item_cond; + hand_ovl->info.catch_pg = top; + *item = EMPTY_NO; + mCO_on_hide_flg(submenu, top, table_idx); + } else { + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.hold_tbl = table; + hand_ovl->info.hold_idx = table_idx; + + if (table == mTG_TABLE_CPMAIL) { + hand_ovl->info.catch_pg = submenu->overlay->cpmail_ovl->page_order[0]; + } else { + hand_ovl->info.catch_pg = 0; + } + + if (mail != NULL) { + mMl_copy_mail(&hand_ovl->info.mail, mail); + mMl_clear_mail(mail); + } else { + hand_ovl->info.item = *item; + hand_ovl->info.item_cond = item_cond; + + if (table == mTG_TABLE_ITEM) { + mPr_SetPossessionItem(Now_Private, table_idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + } else { + *item = EMPTY_NO; + } + } + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_set_catch_se(submenu); +} + +static int mTG_itemNo_to_amount(mActor_name_t itemNo) { + switch (itemNo) { + case ITM_MONEY_1000: + return 1000; + case ITM_MONEY_10000: + return 10000; + case ITM_MONEY_30000: + return 30000; + case ITM_MONEY_100: + return 100; + default: + return 0; + } +} + +static int mTG_make_money_sack(Submenu* submenu, mSM_MenuInfo_c* menu_info, mActor_name_t item) { + u32* money_p = &Now_Private->inventory.wallet; + int amount = mTG_itemNo_to_amount(item); + int res = FALSE; + + if ((int)*money_p >= amount) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + *money_p -= amount; + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.item = item; + hand_ovl->info.item_cond = mPr_ITEM_COND_NORMAL; + hand_ovl->info.wait_timer = 42; + hand_ovl->info.hold_tbl = mTG_TABLE_MONEY; + hand_ovl->info.hold_idx = 0; + hand_ovl->info.catch_pg = 0; + mTG_mark_main_CLR(submenu, menu_info); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + submenu->overlay->inventory_ovl->disp_money_change_frames = -(amount / 42); + sAdo_SysTrgStart(MONO(NA_SE_52)); + res = TRUE; + } + + return res; +} + +static int mTG_drop_furniture(GAME_PLAY* play, mActor_name_t item) { + int idx = -1; + + if (aMR_CLIP != NULL) { + GAME* game = (GAME*)play; + int sq_ofs; + int layer; + int ux; + int uz; + u16 rot; + u16 ftrIdx = mRmTp_FtrItemNo2FtrIdx(item); + + idx = aMR_CLIP->judge_breed_new_ftr_proc(game, ftrIdx, &ux, &uz, &rot, &sq_ofs, &layer); + if (idx >= 0) { + aMR_CLIP->reserve_ftr_proc(game, ftrIdx, idx, ux, uz, rot, sq_ofs, layer); + } + } + + return idx; +} + +static int mTG_nw_drop_furniture(GAME_PLAY* play, int image_no, mActor_name_t itemNo) { + GAME* game = (GAME*)play; + int idx = -1; + int sq_ofs; + int layer; + int ux; + int uz; + u16 rot; + + switch (image_no) { + case mNW_TYPE_MANEKIN: + idx = aMR_CLIP->judge_breed_new_ftr_proc(game, 0x2EA + (itemNo & 7), &ux, &uz, &rot, &sq_ofs, &layer); + break; + case mNW_TYPE_UMBRELLA: + idx = aMR_CLIP->judge_breed_new_ftr_proc(game, 0x362 + (itemNo & 7), &ux, &uz, &rot, &sq_ofs, &layer); + break; + } + + if (idx >= 0) { + switch (image_no) { + case mNW_TYPE_MANEKIN: + aMR_CLIP->reserve_ftr_proc(game, 0x2EA + (itemNo & 7), idx, ux, uz, rot, sq_ofs, layer); + break; + case mNW_TYPE_UMBRELLA: + aMR_CLIP->reserve_ftr_proc(game, 0x362 + (itemNo & 7), idx, ux, uz, rot, sq_ofs, layer); + break; + } + } + + return idx; +} + +static int mTG_get_unit_front_player(xyz_t* pos_p, const xyz_t* player_pos, s16 angle_y) { + int dir; + static f32 offset_pos[][2] = { + // clang-format off + { 0.0f, mFI_UT_WORLDSIZE_Z_F }, + { mFI_UT_WORLDSIZE_X_F, mFI_UT_WORLDSIZE_Z_F }, + { mFI_UT_WORLDSIZE_X_F, 0.0f }, + { mFI_UT_WORLDSIZE_X_F, -mFI_UT_WORLDSIZE_Z_F }, + { 0.0f, -mFI_UT_WORLDSIZE_Z_F }, + { -mFI_UT_WORLDSIZE_X_F, -mFI_UT_WORLDSIZE_Z_F }, + { -mFI_UT_WORLDSIZE_X_F, 0.0f }, + { -mFI_UT_WORLDSIZE_X_F, mFI_UT_WORLDSIZE_Z_F }, + // clang-format on + }; + + if (angle_y > DEG2SHORT_ANGLE2(157.5f) || angle_y <= DEG2SHORT_ANGLE2(-157.5f)) { + dir = 4; + } else if (angle_y > DEG2SHORT_ANGLE2(112.5f)) { + dir = 3; + } else if (angle_y > DEG2SHORT_ANGLE2(67.5f)) { + dir = 2; + } else if (angle_y > DEG2SHORT_ANGLE2(22.5f)) { + dir = 1; + } else if (angle_y > DEG2SHORT_ANGLE2(-22.5f)) { + dir = 0; + } else if (angle_y > DEG2SHORT_ANGLE2(-67.5f)) { + dir = 7; + } else if (angle_y > DEG2SHORT_ANGLE2(-112.5f)) { + dir = 6; + } else { + dir = 5; + } + + pos_p->x = player_pos->x + offset_pos[dir][0]; + pos_p->y = player_pos->y; + pos_p->z = player_pos->z + offset_pos[dir][1]; +} + +static int mTG_check_free_2nd_layer(const xyz_t* pos_p) { + int bx; + int bz; + int ux; + int uz; + mActor_name_t* fg_p; + int res = FALSE; + + if (mFI_Wpos2BlockNum(&bx, &bz, *pos_p) && mFI_Wpos2UtNum_inBlock(&ux, &uz, *pos_p)) { + fg_p = mFI_BkNum2UtFGTop_layer(bx, bz, mCoBG_LAYER1); + if (fg_p != NULL && fg_p[ux + uz * UT_X_NUM] == EMPTY_NO) { + res = TRUE; + } + } + + return res; +} + +static void mTG_set_trade_cond(Submenu* submenu, mSM_MenuInfo_c* menu_info, s16 cond, u32 arg) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + + Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].exchange_type = cond; + Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].extra_data = arg; + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + sAdo_SysTrgStart(NA_SE_33); + submenu->overlay->haniwa_ovl->set_interrupt_message_proc(submenu, tag, 4); +} + +static void mTG_present_open_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int table_idx; + + table_idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT); + sAdo_SysTrgStart(NA_SE_436); + mPr_SetItemCollectBit(Now_Private->inventory.pockets[table_idx]); + submenu->overlay->inventory_ovl->item_scale_type[table_idx] = 5; + submenu->overlay->inventory_ovl->remove_timer = 48; +} + +static void mTG_nw_select_this_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int table_idx; + Submenu_Item_c* item_p; + + table_idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + item_p = submenu->item_p; + item_p->item = RSV_NO; + item_p->slot_no = table_idx; + submenu->selected_item_num = 1; + mTG_close_window(submenu, menu_info, TRUE); +} + +static void mTG_give_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int table_idx; + Submenu_Item_c* item_p; + int category; + + table_idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + item_p = submenu->item_p; + item_p->item = Now_Private->inventory.pockets[table_idx]; + item_p->slot_no = table_idx; + submenu->selected_item_num = 1; + + category = ITEM_NAME_GET_CAT(item_p->item); + if (menu_info->data1 == 2) { + submenu->after_mode = aHOI_REQUEST_GET_PULL_WAIT; + } else if (menu_info->data1 == 1) { + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + } else if (ITEM_NAME_GET_TYPE(item_p->item) == NAME_TYPE_ITEM1 && + (category == ITEM1_CAT_FRUIT || category == ITEM1_CAT_FISH)) { + submenu->after_mode = aHOI_REQUEST_EAT; + } else { + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + } + + mPlib_request_main_give_from_submenu(item_p->item, submenu->after_mode, + mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, item_p->slot_no) & 1, + FALSE); + mTG_close_window(submenu, menu_info, TRUE); +} + +static void mTG_sell_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int table_idx = mTG_get_table_idx(tag); + Submenu_Item_c* item_p = submenu->item_p; + + if (mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, table_idx) == mPr_ITEM_COND_QUEST) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_SELL_QUEST_ITEM); + } else { + item_p->item = Now_Private->inventory.pockets[table_idx]; + item_p->slot_no = table_idx; + submenu->selected_item_num = 1; + mTG_close_window(submenu, menu_info, TRUE); + } +} + +static void mTG_sell_all_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mIV_Ovl_c* inventory_ovl; + int table_idx; + Submenu_Item_c* item_p; + int count; + int i; + + inventory_ovl = submenu->overlay->inventory_ovl; + table_idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + + if (mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, table_idx) == mPr_ITEM_COND_QUEST) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_SELL_QUEST_ITEM); + } else { + item_p = submenu->item_p; + count = 0; + + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + item_p->item = EMPTY_NO; + item_p->slot_no = 0; + item_p++; + } + + item_p = submenu->item_p; + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + if ((inventory_ovl->item_mark_bitfield & (1 << i)) != 0) { + count++; + item_p->item = Now_Private->inventory.pockets[i]; + item_p->slot_no = i; + item_p++; + } + } + + submenu->selected_item_num = count; + mTG_close_window(submenu, menu_info, TRUE); + } +} + +static void mTG_get_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + static mActor_name_t mTG_money_name[] = { ITM_MONEY_100, ITM_MONEY_1000, ITM_MONEY_10000, ITM_MONEY_30000 }; + static u32 mTG_money_amount[] = { 100, 1000, 10000, 30000 }; + int money; + mActor_name_t* item_p2; + int k; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mPr_GetPossessionItemIdxWithCond(Now_Private, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mHW_Ovl_c* haniwa_ovl; + Haniwa_Item_c* haniwa_item_p; + mActor_name_t* item_p; + int changed_money; + int keep_money; + int i; + int j; + mIV_Ovl_c* inventory_ovl; + mActor_name_t* money_name_p; + u32* money_amount_p; + int change_money; + + if (idx == -1) { + haniwa_ovl = submenu->overlay->haniwa_ovl; + + haniwa_ovl->msg_interrupt_idx = 6; + haniwa_ovl->table_idx = tag->table; + haniwa_ovl->sub_idx = tag->tag_col; + haniwa_ovl->msg_time = 120; + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + sAdo_SysTrgStart(MONO(NA_SE_3)); + } else { + haniwa_item_p = &Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col]; + item_p = Now_Private->inventory.pockets; + + money = Now_Private->inventory.wallet; + changed_money = money; + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++, item_p++) { + if (mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, i) == mPr_ITEM_COND_NORMAL) { + changed_money += mTG_itemNo_to_amount(*item_p); + } + } + + changed_money -= haniwa_item_p->extra_data; + if (changed_money < 0) { + submenu->overlay->haniwa_ovl->set_interrupt_message_proc(submenu, tag, 7); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + sAdo_SysTrgStart(MONO(NA_SE_3)); + } else { + inventory_ovl = submenu->overlay->inventory_ovl; + money_name_p = mTG_money_name; + money_amount_p = mTG_money_amount; + + keep_money = money - haniwa_item_p->extra_data; + for (j = 0; j < ARRAY_COUNT(mTG_money_name) && keep_money < 0; j++, money_name_p++, money_amount_p++) { + item_p2 = Now_Private->inventory.pockets; + for (k = 0; k < mPr_POCKETS_SLOT_COUNT; k++, item_p2++) { + if (mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, k) == mPr_ITEM_COND_NORMAL && + *item_p2 == *money_name_p) { + keep_money += *money_amount_p; + mPr_SetPossessionItem(Now_Private, k, EMPTY_NO, mPr_ITEM_COND_NORMAL); + + if (keep_money >= 0) { + break; + } + } + } + } + + Now_Private->inventory.wallet = keep_money; + mPr_SetPossessionItem(Now_Private, idx, haniwa_item_p->item, mPr_ITEM_COND_NORMAL); + submenu->overlay->haniwa_ovl->set_interrupt_message_proc(submenu, tag, 8); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + Save_Get(homes[menu_info->data1]).haniwa.bells += haniwa_item_p->extra_data; + haniwa_item_p->item = EMPTY_NO; + + if (haniwa_item_p->exchange_type == mHm_HANIWA_TRADE_0) { + sAdo_SysTrgStart(NA_SE_5F); + } else { + change_money = (int)keep_money - (int)money; + + if (ABS(change_money) < 42) { + sAdo_SysTrgStart(MONO(NA_SE_REGISTER)); + inventory_ovl->disp_money = keep_money; + } else { + sAdo_SysTrgStart(MONO(NA_SE_52)); + submenu->overlay->hand_ovl->info.wait_timer = 42; + inventory_ovl->disp_money_change_frames = change_money / 42; + + if (ABS(inventory_ovl->disp_money_change_frames) % 5 == 0) { + if (inventory_ovl->disp_money_change_frames > 0) { + inventory_ovl->disp_money_change_frames--; + } else { + inventory_ovl->disp_money_change_frames++; + } + } + } + } + } + } +} + +static void mTG_dump_mail_mark_exe_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + int delete_flag; + int i; + + if (menu_info->menu_type == mSM_OVL_MAILBOX) { + mailbox_ovl->mark_flag = FALSE; + for (i = 0; i < HOME_MAILBOX_SIZE; i++) { + Mail_c* mail = &Common_Get(now_home)->mailbox[i]; + + // clear selected mail if it has a present or is from the player (sending) + if (mail->present != EMPTY_NO || (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4)) { + mailbox_ovl->mark_bitfield &= ~(1 << i); + } + } + + if (mailbox_ovl->mark_bitfield != 0) { + mailbox_ovl->mark_flag = TRUE; + } + } else if (menu_info->menu_type == mSM_OVL_CPMAIL) { + int page = cpmail_ovl->page_order[0]; + + for (i = 0; i < mCM_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) + if (mail->present != EMPTY_NO || (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4)) { + cpmail_ovl->mark_bitfield &= ~(1 << i); + } + } + + cpmail_ovl->mark_flag = FALSE; + if (cpmail_ovl->mark_bitfield != 0) { + cpmail_ovl->mark_flag = TRUE; + } + } + + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + Mail_c* mail = &Now_Private->mail[i]; + + // clear selected mail if it has a present or is from the player (sending) + if (mail->present != EMPTY_NO || (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4)) { + inv_ovl->mail_mark_bitfield2 &= ~(1 << i); + } + } + + inv_ovl->mail_mark_flag = FALSE; + if (inv_ovl->mail_mark_bitfield2 != 0) { + inv_ovl->mail_mark_flag = TRUE; + } + + delete_flag = FALSE; + if (inv_ovl->mail_mark_flag == TRUE) { + delete_flag = TRUE; + } else if (menu_info->menu_type == mSM_OVL_MAILBOX) { + if (mailbox_ovl->mark_flag == TRUE) { + delete_flag = TRUE; + } + } else if (menu_info->menu_type == mSM_OVL_CPMAIL) { + if (cpmail_ovl->mark_flag == TRUE) { + delete_flag = TRUE; + } + } + + if (delete_flag) { + inv_ovl->remove_timer = 24; + sAdo_SysTrgStart(NA_SE_435); + } else { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); +} + +static void mTG_mailbox_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int idx = mMl_chk_mail_free_space(Now_Private->mail, mPr_INVENTORY_MAIL_COUNT); + + inv_ovl->mail_mark_bitfield2 = 0; + if (idx != -1) { + mailbox_ovl->mark_flag = 2; + sAdo_SysTrgStart(NA_SE_MENU_EXIT); + } else { + mailbox_ovl->mark_bitfield = 0; + sAdo_SysTrgStart(MONO(NA_SE_A)); + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); +} + +static void mTG_cpmail_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int inv_free_cnt; + int inv_mark_cnt; + int cpmail_mark_cnt; + int cpmail_free_cnt; + int inv_cnt; + int cpmail_cnt; + int page; + int i; + + inv_mark_cnt = 0; + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + if ((inv_ovl->mail_mark_bitfield2 & (1 << i)) != 0) { + inv_mark_cnt++; + } + } + + cpmail_mark_cnt = 0; + for (i = 0; i < mCM_MAIL_COUNT; i++) { + if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0) { + cpmail_mark_cnt++; + } + } + + inv_free_cnt = 0; + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + if (mMl_check_not_used_mail(&Now_Private->mail[i])) { + inv_free_cnt++; + } + } + + cpmail_free_cnt = 0; + page = cpmail_ovl->page_order[0]; + for (i = 0; i < mCM_MAIL_COUNT; i++) { + if (mMl_check_not_used_mail(&cpmail_ovl->card_mail->mail[page][i]) == TRUE) { + cpmail_free_cnt++; + } + } + + inv_cnt = 0; + cpmail_cnt = 0; + if (inv_mark_cnt > cpmail_mark_cnt && (inv_mark_cnt - cpmail_mark_cnt) > cpmail_free_cnt) { + inv_cnt = (inv_mark_cnt - cpmail_mark_cnt) - cpmail_free_cnt; + } else if (cpmail_mark_cnt > inv_mark_cnt && (cpmail_mark_cnt - inv_mark_cnt) > inv_free_cnt) { + cpmail_cnt = (cpmail_mark_cnt - inv_mark_cnt) - inv_free_cnt; + } + + if (inv_cnt == inv_mark_cnt && cpmail_cnt == cpmail_mark_cnt) { + cpmail_ovl->mark_bitfield = 0; + inv_ovl->mail_mark_bitfield2 = 0; + sAdo_SysTrgStart(MONO(NA_SE_A)); + } else { + int i; + int cnt; + if (inv_cnt > 0) { + for (cnt = 0, i = 0; cnt < inv_cnt && i < mPr_INVENTORY_MAIL_COUNT; i++) { + if ((inv_ovl->mail_mark_bitfield2 & (1 << i)) != 0) { + inv_ovl->mail_mark_bitfield2 &= ~(1 << i); + cnt++; + } + } + } + + if (cpmail_cnt > 0) { + for (cnt = 0, i = 0; cnt < cpmail_cnt && i < mCM_MAIL_COUNT; i++) { + if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0) { + cpmail_ovl->mark_bitfield &= ~(1 << i); + cnt++; + } + } + } + + inv_ovl->mail_mark_flag = 2; + cpmail_ovl->mark_flag = 2; + sAdo_SysTrgStart(NA_SE_MENU_EXIT); + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); +} + +static void mTG_dump_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + inv_ovl->remove_timer = 24; + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + sAdo_SysTrgStart(NA_SE_435); +} + +static void mTG_dump_item_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + inv_ovl->remove_timer = 12; + inv_ovl->item_scale_type[idx] = mIV_ITEM_SCALE_TYPE_SHRINK; + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + sAdo_SysTrgStart(NA_SE_435); +} + +static void mTG_send_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + Mail_c* mail = &Now_Private->mail[idx]; + Submenu_Item_c* item_p = submenu->item_p; + + mail->content.font = mMl_FONT_0; + mMl_copy_mail(&submenu->mail, mail); + mMl_clear_mail(mail); + item_p->slot_no = idx; + item_p->item = ITM_QST_LETTER; + submenu->selected_item_num = 1; + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + mPlib_request_main_give_from_submenu(item_p->item, submenu->after_mode, FALSE, TRUE); + mTG_close_window(submenu, menu_info, TRUE); +} + +static void mTG_rewrite_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_open_board_init(submenu, menu_info, -1, mSM_BD_OPEN_REWRITE, -1); +} + +static void mTG_stick_select_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + + mTG_chg_tag_func2(submenu, menu_info, tag, mTG_TYPE_TAG_NW_SEL_STK_PATTERN); + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_nw_carpet_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + int changed_flag = TRUE; + int change_org_flag = FALSE; + int img_no; + + if (tag_ovl->tags[3].tag_row == 1) { + change_org_flag = TRUE; + } + + if (mRmTp_CheckFloorIsMyOriginalInThisScene()) { + if (change_org_flag) { + img_no = mNW_get_image_no(submenu, idx) & 7; + CLIP(my_indoor_clip)->floor_idx_2_change_floor_proc(FLOOR_MY_ORIG_START + img_no, TRUE); + } else { + img_no = mNW_get_image_no(submenu, idx) & 7; + CLIP(my_indoor_clip)->floor_idx_2_change_floor_proc(FLOOR_MY_ORIG_START + img_no, FALSE); + } + } else { + int free_idx = mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO); + + if (free_idx >= 0) { + mActor_name_t* item_p = &Now_Private->inventory.pockets[free_idx]; + + if (change_org_flag) { + img_no = mNW_get_image_no(submenu, idx) & 7; + *item_p = CLIP(my_indoor_clip)->floor_idx_2_change_floor_proc(FLOOR_MY_ORIG_START + img_no, TRUE); + } else { + img_no = mNW_get_image_no(submenu, idx) & 7; + *item_p = CLIP(my_indoor_clip)->floor_idx_2_change_floor_proc(FLOOR_MY_ORIG_START + img_no, FALSE); + } + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_ORIGINAL); + changed_flag = FALSE; + } + } + + if (changed_flag) { + if (inv_ovl != NULL) { + inv_ovl->original_flag = TRUE; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + } +} + +static void mTG_carpet_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + + if (CLIP(my_indoor_clip) != NULL) { + mActor_name_t* item_p = &Now_Private->inventory.pockets[idx]; + + if (mRmTp_CheckFloorIsMyOriginalInThisScene()) { + CLIP(my_indoor_clip)->change_carpet_proc(*item_p); + *item_p = EMPTY_NO; + } else { + mActor_name_t item; + + item = CLIP(my_indoor_clip)->change_carpet_proc(*item_p); + *item_p = item; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + } +} + +static void mTG_nw_cover_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + int changed_flag = TRUE; + int change_org_flag = FALSE; + int img_no; + + if (tag_ovl->tags[3].tag_row == 1) { + change_org_flag = TRUE; + } + + if (mRmTp_CheckWallIsMyOriginalInThisScene()) { + if (change_org_flag) { + img_no = mNW_get_image_no(submenu, idx) & 7; + CLIP(my_indoor_clip)->wall_idx_2_change_wall_proc(WALL_MY_ORIG_START + img_no, TRUE); + } else { + img_no = mNW_get_image_no(submenu, idx) & 7; + CLIP(my_indoor_clip)->wall_idx_2_change_wall_proc(WALL_MY_ORIG_START + img_no, FALSE); + } + } else { + int free_idx = mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO); + + if (free_idx >= 0) { + mActor_name_t* item_p = &Now_Private->inventory.pockets[free_idx]; + + if (change_org_flag) { + img_no = mNW_get_image_no(submenu, idx) & 7; + *item_p = CLIP(my_indoor_clip)->wall_idx_2_change_wall_proc(WALL_MY_ORIG_START + img_no, TRUE); + } else { + img_no = mNW_get_image_no(submenu, idx) & 7; + *item_p = CLIP(my_indoor_clip)->wall_idx_2_change_wall_proc(WALL_MY_ORIG_START + img_no, FALSE); + } + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_ORIGINAL); + changed_flag = FALSE; + } + } + + if (changed_flag) { + if (inv_ovl != NULL) { + inv_ovl->original_flag = TRUE; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + } +} + +static void mTG_cover_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + + if (CLIP(my_indoor_clip) != NULL) { + mActor_name_t* item_p = &Now_Private->inventory.pockets[idx]; + + if (mRmTp_CheckWallIsMyOriginalInThisScene()) { + CLIP(my_indoor_clip)->change_wall_proc(*item_p); + *item_p = EMPTY_NO; + } else { + mActor_name_t item; + + item = CLIP(my_indoor_clip)->change_wall_proc(*item_p); + *item_p = item; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + } +} + +static void mTG_putin_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + Submenu_Item_c* item_p = submenu->item_p; + + item_p->item = Now_Private->inventory.pockets[idx]; + item_p->slot_no = idx; + submenu->selected_item_num = 1; + + if (menu_info->data0 == 10) { + if (ChkRoomMusicBox((u32)(item_p->item - ITM_MINIDISK_START))) { + item_p->item = EMPTY_NO; + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MUSIC2); + } else { + SetRoomMusicBox((u32)(item_p->item - ITM_MINIDISK_START)); + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mTG_close_window(submenu, menu_info, TRUE); + } + } else { + if (menu_info->data0 != 11) { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + } + + mTG_close_window(submenu, menu_info, TRUE); + } +} + +static void mTG_music_listen_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + Submenu_Item_c* item_p = submenu->item_p; + + item_p->item = ITM_MINIDISK_START + idx; + item_p->slot_no = idx; + submenu->selected_item_num = 1; + mTG_close_window(submenu, menu_info, TRUE); +} + +static void mTG_music_takeout_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + mMU_Ovl_c* music_ovl = submenu->overlay->music_ovl; + u32 mark_cnt = 0; + int free_idx; + int i; + + for (i = 0; i < MINIDISK_NUM; i++) { + if (ChkMusicBox(music_ovl->mark_flg, i)) { + mark_cnt++; + } + } + + if (mark_cnt == 0 || ChkMusicBox(music_ovl->mark_flg, idx) == FALSE) { + if (mPr_GetPossessionItemSum(Now_Private, EMPTY_NO) >= 1) { + free_idx = mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO); + + if (free_idx >= 0) { + ClrRoomMusicBox(idx); + mPr_SetPossessionItem(Now_Private, free_idx, ITM_MINIDISK_START + idx, mPr_ITEM_COND_NORMAL); + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, TRUE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MUSIC); + } + } else { + if (mPr_GetPossessionItemSum(Now_Private, EMPTY_NO) >= 1) { + for (i = 0; i < MINIDISK_NUM; i++) { + if (ChkMusicBox(music_ovl->mark_flg, i)) { + free_idx = mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO); + + if (free_idx >= 0) { + ClrRoomMusicBox(i); + mPr_SetPossessionItem(Now_Private, free_idx, ITM_MINIDISK_START + i, mPr_ITEM_COND_NORMAL); + } + } + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, TRUE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MUSIC); + } + } +} + +static void mTG_island_check_plant_plant(mActor_name_t item) { + if (item == ITM_SAPLING || item == ITM_CEDAR_SAPLING) { + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + } else if (ITEM_IS_FLOWER_BAG(item)) { + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_FLOWER); + } +} + +static void mTG_island_check_fruit_plant(mActor_name_t item) { + switch (item) { + case ITM_FOOD_APPLE: + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_APPLE_TREE); + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + break; + case ITM_FOOD_CHERRY: + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_CHERRY_TREE); + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + break; + case ITM_FOOD_PEAR: + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_PEAR_TREE); + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + break; + case ITM_FOOD_PEACH: + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_PEACH_TREE); + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + break; + case ITM_FOOD_ORANGE: + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_ORANGE_TREE); + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + break; + case ITM_FOOD_COCONUT: + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_COCONUT_TREE); + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_PLANT_TREE); + break; + } +} + +static void mTG_island_check_fruit_eat(mActor_name_t item) { + if (item == ITM_FOOD_COCONUT) { + mISL_SetNowPlayerAction(mISL_PLAYER_ACTION_EAT_COCONUT); + } +} + +static void mTG_plant_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + GAME_PLAY* play = (GAME_PLAY*)gamePT; + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + mActor_name_t plant_item; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + xyz_t pos; + + plant_item = Now_Private->inventory.pockets[idx]; + + if (((Now_Private->equipment >= ITM_SHOVEL && Now_Private->equipment <= ITM_SHOVEL) || + (Now_Private->equipment >= ITM_GOLDEN_SHOVEL && Now_Private->equipment <= ITM_GOLDEN_SHOVEL)) && + inv_ovl->shovel_flag == TRUE) { + mTG_island_check_plant_plant(plant_item); + mTG_island_check_fruit_plant(plant_item); + mPlib_request_main_putin_scoop_from_submenu(&inv_ovl->shovel_pos, Now_Private->inventory.pockets[idx], FALSE); + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, TRUE); + return; + } else { + if (mTG_search_put_pos(player, &pos, TRUE, plant_item == ITM_SIGNBOARD, plant_item == ITM_SIGNBOARD, FALSE, + FALSE)) { + mActor_name_t item = Now_Private->inventory.pockets[idx]; + mActor_name_t throw_item; + + mTG_island_check_plant_plant(item); + if (item == ITM_SAPLING) { + throw_item = TREE_SAPLING; + } else if (item == ITM_CEDAR_SAPLING) { + throw_item = CEDAR_TREE_SAPLING; + } else { + throw_item = FLOWER_PANSIES0 + (item - ITM_WHITE_PANSY_BAG); + } + + if (mTG_common_throw_put_field(play, throw_item, &pos, mCoBG_LAYER0)) { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f); + sAdo_OngenTrgStart(NA_SE_2A, &pos); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, TRUE); + return; + } + } + } + + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_PLANT); +} + +static int mTG_check_island_famicom(mActor_name_t item) { + int res = TRUE; + + if (mFI_CheckInIsland() && + (mSP_SearchItemCategoryPriority(item, mSP_KIND_FURNITURE, mSP_LISTTYPE_HOMEPAGE, NULL) || + mSP_SearchItemCategoryPriority(item, mSP_KIND_FURNITURE, mSP_LISTTYPE_SPECIALPRESENT, NULL))) { + res = FALSE; + } + + return res; +} + +static void mTG_field_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + GAME_PLAY* play = (GAME_PLAY*)gamePT; + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + mActor_name_t put_item = Now_Private->inventory.pockets[idx]; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + xyz_t pos; + + if (inv_ovl->item_mark_bitfield != 0 && (inv_ovl->item_mark_bitfield & (1 << idx)) != 0) { + int i; + int put_cnt = 0; + int bad_famicom_cnt = 0; + + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + if ((inv_ovl->item_mark_bitfield & (1 << i)) != 0) { + mActor_name_t item = Now_Private->inventory.pockets[i]; + + if (mTG_check_island_famicom(item)) { + if (mTG_search_put_pos(player, &pos, item == ITM_SIGNBOARD, FALSE, item == ITM_SIGNBOARD, + item == ITM_SIGNBOARD, item == ITM_SIGNBOARD) && + mTG_common_throw_put_field(play, item, &pos, put_cnt)) { + mPr_SetPossessionItem(Now_Private, i, EMPTY_NO, mPr_ITEM_COND_NORMAL); + put_cnt++; + } + } else { + bad_famicom_cnt++; + } + } + } + + if (put_cnt != 0) { + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, TRUE); + } else if (bad_famicom_cnt != 0) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_ITEM); + } + + inv_ovl->item_mark_bitfield = 0; + } else { + if (put_item == ITM_SIGNBOARD && (mFI_CheckInIsland() || mLd_PlayerManKindCheck())) { + if (mFI_CheckInIsland()) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_SIGN_ISLAND); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_SIGN_OTHER); + } + } else if ((mSP_SearchItemCategoryPriority(put_item, mSP_KIND_FURNITURE, mSP_LISTTYPE_HOMEPAGE, NULL) || + mSP_SearchItemCategoryPriority(put_item, mSP_KIND_FURNITURE, mSP_LISTTYPE_SPECIALPRESENT, NULL)) && + mFI_CheckInIsland()) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); + } else { + if (mTG_search_put_pos(player, &pos, put_item == ITM_SIGNBOARD, FALSE, put_item == ITM_SIGNBOARD, + put_item == ITM_SIGNBOARD, put_item == ITM_SIGNBOARD) && + mTG_common_throw_put_field(play, put_item, &pos, mCoBG_LAYER0)) { + if (menu_info->data0 == 13) { + mPr_SetPossessionItem(Now_Private, idx, (mActor_name_t)menu_info->data1, mPr_ITEM_COND_NORMAL); + mPlib_request_main_wait_from_submenu(); + } else { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + } else { + if (put_item == ITM_SIGNBOARD) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_SIGN); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_ITEM); + } + } + } + } +} + +static void mTG_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + GAME_PLAY* play = (GAME_PLAY*)gamePT; + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx; + mActor_name_t put_item; + mIV_Ovl_c* inv_ovl; + int ftrID; + xyz_t pos; + xyz_t ut_pos; + int ux; + int uz; + + idx = mTG_get_table_idx(tag); + put_item = mRmTp_Item1ItemNo2FtrItemNo_AtPlayerRoom(Now_Private->inventory.pockets[idx], TRUE); + inv_ovl = submenu->overlay->inventory_ovl; + + switch (ITEM_NAME_GET_TYPE(put_item)) { + case NAME_TYPE_FTR0: + case NAME_TYPE_FTR1: + if (!mFI_CheckInIsland() || + !(mSP_SearchItemCategoryPriority(put_item, mSP_KIND_FURNITURE, mSP_LISTTYPE_HOMEPAGE, NULL) || + mSP_SearchItemCategoryPriority(put_item, mSP_KIND_FURNITURE, mSP_LISTTYPE_SPECIALPRESENT, NULL))) { + ftrID = mTG_drop_furniture(play, put_item); + if (ftrID >= 0) { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + mMkRm_ReportChangePlayerRoom(); + } else { + if (ftrID == -1) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_MAX_FURNITURE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FURNITURE); + } + } + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); + } + break; + case NAME_TYPE_ITEM1: + xyz_t_move(&pos, &player->world.position); + if (inv_ovl->item_mark_bitfield != 0 && (inv_ovl->item_mark_bitfield & (1 << idx)) != 0) { + int i; + int cnt = 0; + + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + if ((inv_ovl->item_mark_bitfield & (1 << i)) != 0) { + mActor_name_t item = + mRmTp_Item1ItemNo2FtrItemNo_AtPlayerRoom(Now_Private->inventory.pockets[i], TRUE); + + if (mTG_search_put_pos(player, &pos, FALSE, FALSE, cnt, FALSE, FALSE) && + mTG_common_throw_put_room(play, item, &pos, mCoBG_LAYER0, cnt)) { + mPr_SetPossessionItem(Now_Private, i, EMPTY_NO, mPr_ITEM_COND_NORMAL); + cnt++; + } + } + } + + if (cnt > 0) { + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mMkRm_ReportChangePlayerRoom(); + mTG_close_window(submenu, menu_info, FALSE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_ITEM); + } + } else { + if (aMR_CLIP != NULL) { + mTG_get_unit_front_player(&ut_pos, &pos, player->shape_info.rotation.y); + if (mTG_check_free_2nd_layer(&ut_pos)) { + if (mFI_Wpos2UtNum(&ux, &uz, ut_pos) && aMR_CLIP->judge_place_2nd_layer_proc(ux, uz) && + mTG_common_throw_put_room(play, put_item, &ut_pos, mCoBG_LAYER1, 0)) { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_close_window(submenu, menu_info, FALSE); + mMkRm_ReportChangePlayerRoom(); + return; + } + } + } + + if (mTG_search_put_pos(player, &pos, FALSE, FALSE, 0, FALSE, FALSE) && + mTG_common_throw_put_room(play, put_item, &pos, mCoBG_LAYER0, 0)) { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mMkRm_ReportChangePlayerRoom(); + mTG_close_window(submenu, menu_info, FALSE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_ITEM); + } + } + break; + } +} + +static void mTG_put_all_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + switch (Common_Get(field_type)) { + case mFI_FIELDTYPE2_FG: + mTG_field_put_proc(submenu, menu_info); + break; + case mFI_FIELDTYPE2_PLAYER_ROOM: + mTG_room_put_proc(submenu, menu_info); + break; + case mFI_FIELDTYPE2_NPC_ROOM: + break; + case mFI_FIELDTYPE2_ROOM: + break; + default: + break; + } +} + +static void mTG_dump_mail_mark_conf_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + + mTG_chg_tag_func2(submenu, menu_info, tag, mTG_TYPE_DUMP_MAIL_MARK_CONF); + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_next_open_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + int next_type; + + if (tag->type == mTG_TYPE_CP_DELETE) { + next_type = mTG_TYPE_CP_DELETE2; + } else if (tag->type == mTG_TYPE_TAISOU_CARD || tag->type == mTG_TYPE_FIELD_SIGN) { + next_type = mTG_TYPE_DUMP_ITEM; + } else { + next_type = mTG_TYPE_DUMP_MAIL; + } + + mTG_chg_tag_func2(submenu, menu_info, tag, next_type); + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_next_open_needlework_sel_stick_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + int next_type; + + /* @BUG - if Save::field_type is out of the normal enum value range then next_type will be undefined */ + switch (Common_Get(field_type)) { + case mFI_FIELDTYPE2_PLAYER_ROOM: + if (Save_Get(scene_no) == SCENE_COTTAGE_MY || mSc_IS_SCENE_BASEMENT(Save_Get(scene_no))) { + next_type = mTG_TYPE_TAG_NW_OR_SEL_STICK; + } else { + next_type = mTG_TYPE_TAG_NW_MR_SEL_STICK; + } + break; + case mFI_FIELDTYPE2_FG: + case mFI_FIELDTYPE2_NPC_ROOM: + case mFI_FIELDTYPE2_ROOM: +#ifdef BUGFIXES + default: +#endif + next_type = mTG_TYPE_TAG_NW_OR_SEL_STICK; + break; + } + + mTG_chg_tag_func2(submenu, menu_info, tag, next_type); + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_next_open_needlework_sel_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + + mTG_chg_tag_func2(submenu, menu_info, tag, mTG_TYPE_TAG_NW_SEL_PUT); + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_free_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_set_trade_cond(submenu, menu_info, mHm_HANIWA_TRADE_0, 0); +} + +static void mTG_catch_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + mTG_tag_c* cur_tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + int idx = 0; + int item_cond = mPr_ITEM_COND_NORMAL; + mActor_name_t* item_p = NULL; + Mail_c* mail_p = NULL; + + if (cur_tag->table == mTG_TABLE_ITEM) { + idx = mTG_get_table_idx(tag); + item_p = &Now_Private->inventory.pockets[idx]; + item_cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + if (*item_p != EMPTY_NO) { + mQst_CheckGrabItem(*item_p, idx); + } + } else if (cur_tag->table == mTG_TABLE_MAIL || cur_tag->table == mTG_TABLE_MBOX || + cur_tag->table == mTG_TABLE_CPMAIL) { + idx = mTG_get_table_idx(tag); + mail_p = mTG_get_mail_pointer(submenu, NULL); + + if (mMl_check_not_used_mail(mail_p) == TRUE) { + return; + } + + if (submenu->overlay->tag_ovl->sel_tag_idx == 0 && menu_info->menu_type != mSM_OVL_MAILBOX && + menu_info->menu_type != mSM_OVL_CPMAIL) { + item_p = &mail_p->present; + if (*item_p != EMPTY_NO) { + if (mMl_check_set_present_myself(mail_p)) { + item_cond = mPr_ITEM_COND_NORMAL; + mail_p = NULL; + } else if (mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO) != -1) { + item_cond = mPr_ITEM_COND_PRESENT; + mail_p = NULL; + } else { + item_p = NULL; + } + } else { + item_p = NULL; + } + } + } else { + mActor_name_t item; + + switch (cur_tag->table) { + case mTG_TABLE_HANIWA: + idx = tag->tag_col; + item_p = &Save_Get(homes[menu_info->data1]).haniwa.items[idx].item; + break; + case mTG_TABLE_PLAYER: + item_p = &Now_Private->equipment; + break; + case mTG_TABLE_MONEY: + mTG_make_money_sack(submenu, menu_info, ITM_MONEY_100); + return; + case mTG_TABLE_NEEDLEWORK: + case mTG_TABLE_CPORIGINAL_NW: + idx = mTG_get_table_idx(tag); + item_p = &item; + item = RSV_NW_ORIGINAL0 + idx; + break; + case mTG_TABLE_CPORIGINAL: + idx = mTG_get_table_idx(tag); + item = RSV_CPORIGINAL_FLD0_00 + mCO_top_folder(submenu) * mCO_ORIGINAL_NUM + idx; + item_p = &item; + break; + case mTG_TABLE_GBA: + case mTG_TABLE_CARD: + idx = mTG_get_table_idx(tag); + item_p = &item; + item = RSV_GBAORIGINAL0 + idx; + break; + } + } + + if (mail_p != NULL || (item_p != NULL && *item_p != EMPTY_NO)) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + mTG_mark_main_CLR(submenu, menu_info); + if (cur_tag->table == mTG_TABLE_HANIWA) { + hand_ovl->info.haniwa_item_cond = Save_Get(homes[menu_info->data1]).haniwa.items[idx].exchange_type; + hand_ovl->info.haniwa_item_price = Save_Get(homes[menu_info->data1]).haniwa.items[idx].extra_data; + } else { + hand_ovl->info.haniwa_item_cond = mPr_ITEM_COND_PRESENT; + hand_ovl->info.haniwa_item_price = 0; + } + + mTG_catch_item_from_table(submenu, mail_p, item_p, item_cond, cur_tag->table, idx); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + } +} + +static int mTG_mail_check(Mail_c* mail) { + int flags = 0; + + if (mail->present != EMPTY_NO) { + flags |= mTG_MAIL_FLAG_PRESENT; + } + + if (!mMl_check_send_mail(mail)) { + flags |= mTG_MAIL_FLAG_RECV; + } + + return flags; +} + +static void mTG_password_item_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + Submenu_Item_c* item_p = submenu->item_p; + + if (mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx) == mPr_ITEM_COND_QUEST) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_SELL_QUEST_ITEM); + } else { + item_p->item = Now_Private->inventory.pockets[idx]; + item_p->slot_no = idx; + submenu->selected_item_num = 1; + mTG_close_window(submenu, menu_info, TRUE); + } +} + +static int mTG_mark_enable_check(int menu_type, int param, int table, u8 field_type) { + int res = mTG_MARK_TYPE_NONE; + + switch (menu_type) { + case mSM_OVL_INVENTORY: + switch (param) { + case mSM_IV_OPEN_NORMAL: + switch (table) { + case mTG_TABLE_ITEM: + switch (field_type) { + case mFI_FIELDTYPE2_FG: + res = mTG_MARK_TYPE_INV_FG_ITEM; + break; + case mFI_FIELDTYPE2_PLAYER_ROOM: + res = mTG_MARK_TYPE_INV_PLAYERROOM_ITEM; + break; + default: + res = mTG_MARK_TYPE_INV_OTHERROOM_ITEM; + break; + } + break; + case mTG_TABLE_MAIL: + if (field_type == mFI_FIELDTYPE2_FG) { + res = mTG_MARK_TYPE_INV_FG_MAIL; + } + break; + } + break; + case mSM_IV_OPEN_MAILBOX: + res = mTG_MARK_TYPE_INV_MAILBOX; + break; + case mSM_IV_OPEN_SELL: + if (table == mTG_TABLE_ITEM) { + res = mTG_MARK_TYPE_INV_SELL_ITEM; + } + break; + } + break; + case mSM_OVL_MAILBOX: + res = mTG_MARK_TYPE_MAILBOX; + break; + case mSM_OVL_CPMAIL: + switch (table) { + case mTG_TABLE_CPMAIL: + res = mTG_MARK_TYPE_CPMAIL_CPMAIL; + break; + case mTG_TABLE_MAIL: + res = mTG_MARK_TYPE_CPMAIL_MAIL; + break; + } + break; + case mSM_OVL_MUSIC: + res = mTG_MARK_TYPE_MUSIC; + break; + case mSM_OVL_NEEDLEWORK: + // scrapped? + break; + case mSM_OVL_CPORIGINAL: + // scrapped? + break; + } + + return res; +} + +typedef union tag_mark_field_u { + u16 field16; + u32 field32; + u32 music_box[2]; + u8 u8array[8]; +} mTG_mark_field_u; + +static int mTG_mark_main_sub(Submenu* submenu, int menu_type, int param, int table, int table_idx, Mail_c* mail, + int mode, mTG_mark_field_u** mark_bitfield_p, int* max_mark_count, + mTG_mark_field_u* updated_mark_bitfield) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + mMU_Ovl_c* music_ovl = submenu->overlay->music_ovl; + mNW_Ovl_c* needlework_ovl = submenu->overlay->needlework_ovl; + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int mark_type; + + mark_type = mTG_mark_enable_check(menu_type, param, table, Common_Get(field_type)); + switch (mark_type) { + case mTG_MARK_TYPE_NONE: + return FALSE; + case mTG_MARK_TYPE_INV_FG_ITEM: + case mTG_MARK_TYPE_INV_PLAYERROOM_ITEM: { + mActor_name_t item = Now_Private->inventory.pockets[table_idx]; + u32 cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, table_idx); + int type; + int category; + + category = ITEM_NAME_GET_CAT(item); + type = ITEM_NAME_GET_TYPE(item); + *(u16**)mark_bitfield_p = &inv_ovl->item_mark_bitfield; + updated_mark_bitfield->field16 = 1 << table_idx; + *max_mark_count = mPr_POCKETS_SLOT_COUNT; + + if ((mode == mTG_MARK_CHK || mode == mTG_MARK_OFF || mode == mTG_MARK_CLR) || + (item != EMPTY_NO && cond == mPr_ITEM_COND_NORMAL && !ITEM_IS_EXERCISE_CARD(item) && + item != ITM_KNIFE_AND_FORK && !ITEM_IS_BALLOON(item) && + (type != NAME_TYPE_ITEM1 || (category != ITEM1_CAT_FISH && category != ITEM1_CAT_INSECT)) && + (mark_type != mTG_MARK_TYPE_INV_FG_ITEM || + (mark_type == mTG_MARK_TYPE_INV_FG_ITEM && item != ITM_SIGNBOARD)) && + (mark_type != mTG_MARK_TYPE_INV_PLAYERROOM_ITEM || + ((mark_type == mTG_MARK_TYPE_INV_PLAYERROOM_ITEM && type != NAME_TYPE_FTR0 && + type != NAME_TYPE_FTR1) && + (!ITEM_IS_UMBRELLA(item) && !ITEM_IS_CLOTH(item)))) && + (mEv_CheckFirstJob() == FALSE || mark_type == mTG_MARK_TYPE_INV_PLAYERROOM_ITEM || + type != NAME_TYPE_ITEM1 || category != ITEM1_CAT_PLANT))) { + return TRUE; + } + return FALSE; + } + case mTG_MARK_TYPE_INV_OTHERROOM_ITEM: + return FALSE; + case mTG_MARK_TYPE_INV_SELL_ITEM: { + mActor_name_t item = Now_Private->inventory.pockets[table_idx]; + + *(u16**)mark_bitfield_p = &inv_ovl->item_mark_bitfield; + updated_mark_bitfield->field16 = 1 << table_idx; + *max_mark_count = mPr_POCKETS_SLOT_COUNT; + + if ((mode == mTG_MARK_CHK || mode == mTG_MARK_OFF || mode == mTG_MARK_CLR) || + (item != EMPTY_NO && !ITEM_IS_EXERCISE_CARD(item) && item != ITM_KNIFE_AND_FORK && + (ITEM_NAME_GET_TYPE(item) != NAME_TYPE_ITEM1 || (ITEM_NAME_GET_CAT(item) != ITEM1_CAT_MONEY)) && + (Common_Get(time.rtc_time).weekday != lbRTC_SUNDAY || + (ITEM_NAME_GET_TYPE(item) != NAME_TYPE_ITEM1 || (ITEM_NAME_GET_CAT(item) != ITEM1_CAT_KABU))))) { + return TRUE; + } + return FALSE; + } + case mTG_MARK_TYPE_INV_FG_MAIL: + case mTG_MARK_TYPE_INV_MAILBOX: + case mTG_MARK_TYPE_CPMAIL_MAIL: + case mTG_MARK_TYPE_MAILBOX: + case mTG_MARK_TYPE_CPMAIL_CPMAIL: { + if (table == mTG_TABLE_MAIL) { + *(u16**)mark_bitfield_p = &inv_ovl->mail_mark_bitfield2; + updated_mark_bitfield->field16 = 1 << table_idx; + *max_mark_count = mPr_INVENTORY_MAIL_COUNT; + + if (mode != mTG_MARK_CHK && mode != mTG_MARK_OFF && mode != mTG_MARK_CLR) { + if (mMl_check_not_used_mail(mail) == TRUE) { + return FALSE; + } + + if (menu_type == mSM_OVL_MAILBOX) { + if (mail->present != EMPTY_NO || + (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4) || + (mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV) { + return FALSE; + } + } else if (menu_type == mSM_OVL_CPMAIL) { + if ((mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV) { + return FALSE; + } + } else { + if ((mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4) || + (mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV || + (mTG_mail_check(mail) & mTG_MAIL_FLAG_PRESENT) == mTG_MAIL_FLAG_PRESENT) { + return FALSE; + } + } + } + + return TRUE; + } else if (table == mTG_TABLE_MBOX) { + *(u16**)mark_bitfield_p = &mailbox_ovl->mark_bitfield; + updated_mark_bitfield->field16 = 1 << table_idx; + *max_mark_count = HOME_MAILBOX_SIZE; + + if ((mode != mTG_MARK_CHK || mode != mTG_MARK_OFF || mode != mTG_MARK_CLR)) { + if (mMl_check_not_used_mail(mail) == TRUE || + (mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV) { + return FALSE; + } + return TRUE; + } + } else if (table == mTG_TABLE_CPMAIL) { + if ((mode != mTG_MARK_CHK || mode != mTG_MARK_OFF || mode != mTG_MARK_CLR)) { + if (mMl_check_not_used_mail(mail) == TRUE || + (mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV) { + return FALSE; + } + } + + *(u32**)mark_bitfield_p = &cpmail_ovl->mark_bitfield; + updated_mark_bitfield->field32 = 1 << table_idx; + *max_mark_count = mCM_MAIL_COUNT; + } else { + return FALSE; + } + break; + } + case mTG_MARK_TYPE_MUSIC: { + *(u32**)mark_bitfield_p = music_ovl->mark_flg; + updated_mark_bitfield->music_box[(table_idx / 32)] = 1 << ((u32)table_idx - (table_idx / 32) * 32); + // SetMusicBox(updated_mark_bitfield->music_box, table_idx); + *max_mark_count = MINIDISK_NUM; + + if ((mode != mTG_MARK_CHK || mode != mTG_MARK_OFF || mode != mTG_MARK_CLR)) { + if (!ChkRoomMusicBox(table_idx)) { + return FALSE; + } + } + break; + } + case mTG_MARK_TYPE_NEEDLEWORK_ORIGINAL: + *(u16**)mark_bitfield_p = &needlework_ovl->mark_flg; + updated_mark_bitfield->field16 = 1 << table_idx; + *max_mark_count = mPr_ORIGINAL_DESIGN_COUNT; + + if (mode == mTG_MARK_CHK || mode == mTG_MARK_OFF || mode == mTG_MARK_CLR) { + if (mNW_check_hide_flg(submenu, table_idx)) { + return FALSE; + } + } + break; + case mTG_MARK_TYPE_CPORIGINAL_ORIGINAL: + *(u16**)mark_bitfield_p = &cporiginal_ovl->mark_flg; + updated_mark_bitfield->field16 = 1 << table_idx; + *max_mark_count = mCO_ORIGINAL_NUM; + + if (mode == mTG_MARK_CHK || mode == mTG_MARK_OFF || mode == mTG_MARK_CLR) { + if (mCO_check_hide_flg(submenu, mCO_top_folder(submenu), table_idx)) { + return FALSE; + } + } + break; + } + + return TRUE; +} + +static int mTG_bit_chk(u8* flags, u8* masks, int count) { + int res = 0; + int i; + + for (i = 0; i < count; i++) { + res |= *flags++ & *masks++; + } + + return res; +} + +static void mTG_bit_on(u8* flags, u8* bits, int count) { + int i; + + for (i = 0; i < count; i++) { + *flags++ |= *bits++; + } +} + +static void mTG_bit_off(u8* flags, u8* bits, int count) { + int i; + + for (i = 0; i < count; i++) { + *flags++ &= ~*bits++; + } +} + +static void mTG_bit_rvs(u8* flags, u8* bits, int count) { + int i; + + for (i = 0; i < count; i++) { + *flags++ ^= *bits++; + } +} + +static void mTG_bit_clr(u8* flags, u8* bits, int count) { + int i; + + for (i = 0; i < count; i++) { + *flags++ = 0; + } +} + +static int mTG_bit_chk_all0(u8* flags, u8* bits, int count) { + int res = 0; + int i; + + for (i = 0; i < count; i++) { + res |= *flags++ == 0; + } + + return res; +} + +static int mTG_mark_mainX(Submenu* submenu, mSM_MenuInfo_c* menu_info, int table, int table_idx, int mode, + int* chk_result) { + int mark_res; + Mail_c* mail; + mTG_mark_field_u set_flags; + mTG_mark_field_u* current_flags_p; + int max_flag_count; + int chk_res = FALSE; + int i; + + for (i = 0; i < 8; i++) { + set_flags.u8array[i] = 0; + } + + mail = mTG_get_mail_pointer(submenu, NULL); + mark_res = mTG_mark_main_sub(submenu, menu_info->menu_type, menu_info->data0, table, table_idx, mail, mode, + ¤t_flags_p, &max_flag_count, &set_flags); + if (mark_res) { + int byte_count = ((max_flag_count + 15) / 16) * 2; + + switch (mode) { + case mTG_MARK_CHK: + chk_res = mTG_bit_chk(current_flags_p->u8array, set_flags.u8array, byte_count); + break; + case mTG_MARK_ON: + mTG_bit_on(current_flags_p->u8array, set_flags.u8array, byte_count); + break; + case mTG_MARK_OFF: + mTG_bit_off(current_flags_p->u8array, set_flags.u8array, byte_count); + break; + case mTG_MARK_RVS: + mTG_bit_rvs(current_flags_p->u8array, set_flags.u8array, byte_count); + break; + case mTG_MARK_CLR: + mTG_bit_clr(current_flags_p->u8array, set_flags.u8array, byte_count); + break; + case mTG_MARK_CHK_ALL0: + chk_res = mTG_bit_chk_all0(current_flags_p->u8array, set_flags.u8array, byte_count); + break; + } + + if (mode != mTG_MARK_CHK) { + mTG_mark_mainX(submenu, menu_info, table, table_idx, mTG_MARK_CHK, &chk_res); + } + } + + if (chk_result != NULL) { + *chk_result = chk_res; + } + + return mark_res; +} + +static void mTG_mark_main_CLR(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + switch (menu_info->menu_type) { + case mSM_OVL_INVENTORY: + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_ITEM, 0, mTG_MARK_CLR, NULL); + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_MAIL, 0, mTG_MARK_CLR, NULL); + break; + case mSM_OVL_MAILBOX: + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_MAIL, 0, mTG_MARK_CLR, NULL); + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_MBOX, 0, mTG_MARK_CLR, NULL); + break; + case mSM_OVL_CPMAIL: + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_MAIL, 0, mTG_MARK_CLR, NULL); + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_CPMAIL, 0, mTG_MARK_CLR, NULL); + break; + case mSM_OVL_CPORIGINAL: + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_CPORIGINAL_NW, 0, mTG_MARK_CLR, NULL); + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_CPORIGINAL, 0, mTG_MARK_CLR, NULL); + break; + } +} + +static int mTG_mark_main(Submenu* submenu, mSM_MenuInfo_c* menu_info, int mode, int* chk_result) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + + return mTG_mark_mainX(submenu, menu_info, tag->table, idx, mode, chk_result); +} + +static void mTG_write_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + int mail_idx = mMl_chk_mail_free_space(Now_Private->mail, mPr_INVENTORY_MAIL_COUNT); + + if (mail_idx >= 0) { + mTG_open_board_init(submenu, menu_info, mail_idx, mSM_BD_OPEN_WRITE, idx); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_WRITE); + } +} + +static void mTG_priceset_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + mTG_tag_c* sel_tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + + mTG_chg_tag_func2(submenu, menu_info, sel_tag, mTG_TYPE_HANIWA_PRICE); + submenu->overlay->haniwa_ovl->price = Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].extra_data; + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_present_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + Mail_c* mail = &Now_Private->mail[idx]; + int present_myself = mMl_check_set_present_myself(mail); + + if (present_myself == FALSE && mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO) == -1) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PR_LEAVE); + } else { + mTG_catch_item_from_table(submenu, NULL, &mail->present, + present_myself ? mPr_ITEM_COND_NORMAL : mPr_ITEM_COND_PRESENT, mTG_TABLE_MAIL, idx); + } +} + +static void mTG_show_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_set_trade_cond(submenu, menu_info, mHm_HANIWA_TRADE_1, 0); +} + +static void mTG_cancel_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + if (menu_info->menu_type == mSM_OVL_INVENTORY) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + if (menu_info->data0 == mSM_IV_OPEN_QUEST) { + mTG_close_window(submenu, menu_info, TRUE); + } else { + if (inv_ovl != NULL) { + inv_ovl->mail_mark_flag = 0; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT); + sAdo_SysTrgStart(MONO(NA_SE_3)); + } + } else { + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT); + sAdo_SysTrgStart(MONO(NA_SE_3)); + } } From 4b21329bca4f26e98855ad54ebeacc680c30dc55 Mon Sep 17 00:00:00 2001 From: Cuyler36 <24523422+Cuyler36@users.noreply.github.com> Date: Sun, 20 Oct 2024 11:06:16 -0400 Subject: [PATCH 7/8] m_tag_ovl 75% matched --- include/ac_my_room.h | 4 + include/audio_defs.h | 5 +- include/m_cpmail_ovl.h | 4 +- include/m_cporiginal_ovl.h | 1 + include/m_mail.h | 10 +- include/m_mailbox_ovl.h | 2 + include/m_name_table.h | 4 + include/m_needlework_ovl.h | 1 + include/m_shop.h | 1 + include/m_tag_ovl.h | 57 +- src/ac_my_room_move.c_inc | 14 +- src/ac_shop_level.c | 2 +- src/m_fishrecord.c | 2 +- src/m_hand_ovl.c | 26 +- src/m_mail.c | 4 +- src/m_mark_room.c | 2 +- src/m_mark_room_ovl.c | 2 +- src/m_npc.c | 6 +- src/m_post_office.c | 2 +- src/m_quest.c | 2 +- src/m_shop.c | 4 +- src/m_submenu_ovl.c | 2 +- src/m_tag_ovl.c | 2138 +++++++++++++++++++++++++++++++++++- src/save_check.c_inc | 2 +- 24 files changed, 2206 insertions(+), 91 deletions(-) diff --git a/include/ac_my_room.h b/include/ac_my_room.h index 766ca477..cdfedbc2 100644 --- a/include/ac_my_room.h +++ b/include/ac_my_room.h @@ -19,6 +19,10 @@ extern "C" { #define aMR_NO_FTR_ID 200 #define aMR_NO_FTR_ID2 201 +#define aMR_JUDGE_MAX_FTR -1 +#define aMR_JUDGE_CANT_PLACE_FTR -2 +#define aMR_JUDGE_OTHER_ROOM -3 + typedef struct my_room_actor_s MY_ROOM_ACTOR; enum { diff --git a/include/audio_defs.h b/include/audio_defs.h index 8a730450..d56c3a82 100644 --- a/include/audio_defs.h +++ b/include/audio_defs.h @@ -69,7 +69,7 @@ typedef enum audio_sound_effects { NA_SE_TOOL_FURI = 0x5A, // swing? NA_SE_AMI_HIT = 0x5C, NA_SE_TOOL_GET, - + NA_SE_5E = 0x5E, NA_SE_5F = 0x5F, NA_SE_60 = 0x60, @@ -157,6 +157,8 @@ typedef enum audio_sound_effects { NA_SE_SOFT_CHAIR_STANDUP, NA_SE_HARD_CHAIR_STANDUP, + NA_SE_426 = 0x426, + NA_SE_BUBU_CHAIR_STANDUP = 0x429, NA_SE_JUMP, NA_SE_LANDING, @@ -174,6 +176,7 @@ typedef enum audio_sound_effects { NA_SE_KARABURI = 0x43A, NA_SE_ROD_STROKE_SMALL = 0x445, + NA_SE_446 = 0x446, NA_SE_SCOOP_TREE_HIT = 0x448, NA_SE_SCOOP_ITEM_HIT, diff --git a/include/m_cpmail_ovl.h b/include/m_cpmail_ovl.h index a771e9f5..b9d1ea4e 100644 --- a/include/m_cpmail_ovl.h +++ b/include/m_cpmail_ovl.h @@ -27,7 +27,9 @@ struct cpmail_ovl_s { u32 _BB0; u32 mark_bitfield; int mark_flag; - u8 _BBC[0xBC4 - 0xBBC]; + u8 _BBC; + u32 mark_bitfield2; + // u8 _BBC[0xBC4 - 0xBBC]; }; extern void mCM_cpmail_ovl_construct(Submenu* submenu); diff --git a/include/m_cporiginal_ovl.h b/include/m_cporiginal_ovl.h index c225c9e5..fe70dd30 100644 --- a/include/m_cporiginal_ovl.h +++ b/include/m_cporiginal_ovl.h @@ -39,6 +39,7 @@ extern void mCO_swap_image(Submenu* submenu, mActor_name_t item0, mActor_name_t 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); +extern int mCO_check_mark_flg(Submenu* submenu, int idx); extern int mCO_check_hide_flg(Submenu* submenu, int folder, int idx); extern void mCO_on_hide_flg(Submenu* submenu, int folder, int idx); extern void mCO_clear_hide_flg(Submenu* submenu); diff --git a/include/m_mail.h b/include/m_mail.h index 8c5b95a6..088e3f5f 100644 --- a/include/m_mail.h +++ b/include/m_mail.h @@ -31,11 +31,11 @@ enum { }; enum { - mMl_FONT_0, - mMl_FONT_SEND, - mMl_FONT_2, - mMl_FONT_3, - mMl_FONT_4, + mMl_FONT_RECV, /* Received letter (with or without a present attached), unread */ + mMl_FONT_SEND, /* Player-written letter */ + mMl_FONT_RECV_READ, /* Recieved letter, with/without present, and then read it */ + mMl_FONT_RECV_PLAYER_PRESENT, /* Recieved letter where present was attached, unread */ + mMl_FONT_RECV_PLAYER_PRESENT_READ, /* Recieved letter where present was attached, read */ mMl_FONT_NUM }; diff --git a/include/m_mailbox_ovl.h b/include/m_mailbox_ovl.h index 0737d341..a1d66da5 100644 --- a/include/m_mailbox_ovl.h +++ b/include/m_mailbox_ovl.h @@ -8,6 +8,8 @@ extern "C" { #endif +#define mMB_MAIL_COUNT HOME_MAILBOX_SIZE + typedef int (*mMB_GET_LAST_MAIL_IDX_PROC)(void); struct mailbox_ovl_s { diff --git a/include/m_name_table.h b/include/m_name_table.h index 20beb1f6..97d2c389 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -207,6 +207,7 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define NPC_HOUSE_ID_TO_NPC_ID(house) (house + 0x9000) #define NPC_ID_TO_NPC_HOUSE_ID(npc) (npc - 0x9000) +#define ITEM_IS_INSECT(n) ((n) >= ITM_INSECT_START && (n) < ITM_INSECT_END) #define ITEM_IS_WISP(n) ((n) >= ITM_SPIRIT0 && (n) <= ITM_SPIRIT4) #define ITEM_IS_PAPER(n) ((n) >= ITM_PAPER_START && (n) <= (ITM_PAPER_END - 1)) #define ITEM_IS_CLOTH(n) ((n) >= ITM_CLOTH_START && (n) < ITM_CLOTH_END) @@ -530,6 +531,9 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITEM_IS_EXERCISE_CARD(item) ((item) >= ITM_EXCERCISE_CARD00 && (item) <= ITM_EXCERCISE_CARD12) #define ITEM_IS_BALLOON(item) ((item) >= ITM_BALLOON_START && (item) <= ITM_BUNNY_O_BALLOON) #define ITEM_IS_UMBRELLA(item) ((item) >= ITM_UMBRELLA_START && (item) <= ITM_UMBRELLA_END) +#define ITEM_IS_MYUMBRELLA_TOOL(item) ((item) >= ITM_MY_ORG_UMBRELLA0 && (item) <= ITM_MY_ORG_UMBRELLA7) +#define ITEM_IS_SCOOP(item) ((item) >= ITM_SHOVEL && (item) <= ITM_SHOVEL) +#define ITEM_IS_GOLD_SCOOP(item) ((item) >= ITM_GOLDEN_SHOVEL && (item) <= ITM_GOLDEN_SHOVEL) #define BG_CATEGORY 0 #define ENV_CATEGORY 8 diff --git a/include/m_needlework_ovl.h b/include/m_needlework_ovl.h index 4230ceba..3d845af1 100644 --- a/include/m_needlework_ovl.h +++ b/include/m_needlework_ovl.h @@ -20,6 +20,7 @@ struct needlework_ovl_s { extern u8 mNW_get_image_no(Submenu* submenu, int slot_no); extern u8* mNW_get_image_name(Submenu* submenu, int idx); extern int mNW_check_hide_flg(Submenu* submenu, int idx); +extern int mNW_check_mark_flg(Submenu* submenu, int idx); extern void mNW_on_hide_flg(Submenu* submenu, int idx); extern void mNW_clear_hide_flg(Submenu* submenu); extern void mNW_draw_original(Submenu* submenu, GRAPH* graph, f32 pos_x, f32 pos_y, f32 scale, int idx, int color_flag); diff --git a/include/m_shop.h b/include/m_shop.h index 5605202d..4cae32a4 100644 --- a/include/m_shop.h +++ b/include/m_shop.h @@ -212,6 +212,7 @@ typedef struct shop_s { /* 0x13C */ int visitor_flag; /* set when a foreign player enters Nook's shop, required for Nookington's */ } Shop_c; +#define mSP_GC_FAMICOM_TABLE_CNT 8 // update this if the # of items in mSP_gc_famicom_table is changed extern mActor_name_t mSP_gc_famicom_table[]; extern int mSP_CollectCheck(mActor_name_t item); diff --git a/include/m_tag_ovl.h b/include/m_tag_ovl.h index ba031322..fd773e10 100644 --- a/include/m_tag_ovl.h +++ b/include/m_tag_ovl.h @@ -47,6 +47,20 @@ enum { mTG_MARK_TYPE_NUM }; +enum { + mTG_CHANGE_ORIGINAL_MARK_NONE, + mTG_CHANGE_ORIGINAL_MARK_DECIDE, + mTG_CHANGE_ORIGINAL_MARK_MOVE, + + mTG_CHANGE_ORIGINAL_MARK_NUM +}; + +enum { + mTG_CHANGE_MAIL_MARK_DECIDE, + mTG_CHANGE_MAIL_MARK_MOVE, + + mTG_CHANGE_MAIL_MARK_NUM +}; enum { mTG_TYPE_NONE, @@ -158,11 +172,16 @@ enum { mTG_TABLE_GBA, mTG_TABLE_GBA_NW, mTG_TABLE_CARD, - mTG_TABLE_GBA_NW2, + mTG_TABLE_CARD_NW, mTG_TABLE_NUM }; +#define mTG_RETURN_CLOSE 0 +#define mTG_RETURN_KEEP 1 + +#define mTG_MARK_IDX_UNSET 0x7FFF + /* sizeof(mTG_tag_c) == 0xB4 */ typedef struct tag_s { u8 type; @@ -193,6 +212,28 @@ typedef void (*mTG_EXCHANGE_PROC)(Submenu*, mSM_MenuInfo_c*); typedef Mail_c* (*mTG_GET_MAIL_POINTER_PROC)(Submenu*, mHD_Ovl_c*); typedef int (*mTG_GET_TABLE_IDX_PROC)(mTG_tag_c*); +typedef struct tag_cpmail_mark_pos_s { + Mail_c* _00; + f32 pos[2]; +} mTG_cpmail_mark_pos_c; + +typedef struct tag_cpmail_mark_s { + Mail_c* _00[4]; + Mail_c* mail_tbl[4]; + f32 _20[2][2]; + f32 _30[2][2]; + s16 idx_tbl[4]; + s16 mode; + s16 _4A; +} mTG_cpmail_mark_c; + +typedef struct tag_cporiginal_mark_s { + f32 _00[2][2]; + f32 _10[2][2]; + s16 needlework_idx; + s16 cporiginal_idx; +} mTG_cporiginal_mark_c; + /* TODO */ struct tag_ovl_s { /* 0x000 */ int sel_tag_idx; @@ -205,7 +246,19 @@ struct tag_ovl_s { /* 0x2E8 */ mTG_GET_MAIL_POINTER_PROC get_mail_pointer_proc; /* 0x2EC */ mTG_GET_TABLE_IDX_PROC get_table_idx_proc; /* 0x2F0 */ s16 item_name_wait_time; - /* 0x2F2 */ u8 _2F2[0x3C4 - 0x2F2]; + /* 0x2F4 */ mTG_cpmail_mark_pos_c _2F4[4]; + /* 0x324 */ mTG_cpmail_mark_c cpmail_mark[1]; + /* 0x370 */ f32 _370; + /* 0x374 */ int _374; + /* 0x378 */ mActor_name_t _378[2]; + /* 0x37C */ int _37C[5]; + /* 0x390 */ mTG_cporiginal_mark_c cporiginal_mark[1]; + /* 0x3B4 */ f32 _3B4; + /* 0x3B8 */ u16 needlework_mark_flg; + /* 0x3BA */ u16 cporiginal_mark_flg; + /* 0x3BC */ s16 needlework_mark_max; + /* 0x3BE */ s16 cporiginal_mark_max; + /* 0x3C0 */ s16 change_original_mark_mode; }; extern int mTG_mark_main(Submenu*, mSM_MenuInfo_c*, int, int*); diff --git a/src/ac_my_room_move.c_inc b/src/ac_my_room_move.c_inc index c15c7d25..9b7b662b 100644 --- a/src/ac_my_room_move.c_inc +++ b/src/ac_my_room_move.c_inc @@ -1863,14 +1863,14 @@ static int aMR_JudgeBreedNewFurniture(GAME* game, u16 ftr_no, int* ut_x, int* ut u16 angle; if (mCoBG_CheckUtFlat(&player_pos) == FALSE) { - return -2; + return aMR_JUDGE_CANT_PLACE_FTR; } if (aMR_CLIP != NULL && my_room != NULL && aMR_CheckReserveFlag(my_room, 0) == FALSE) { *rotation = 0; *square_offset = 0; *layer = 0; - return -2; + return aMR_JUDGE_CANT_PLACE_FTR; } aMR_Wpos2PlaceNumber(&cur_ut_x, &cur_ut_z, player_pos, 0); @@ -1907,7 +1907,7 @@ static int aMR_JudgeBreedNewFurniture(GAME* game, u16 ftr_no, int* ut_x, int* ut for (i = 0; i < 5; i++) { if (aMR_WeightPossible((ACTOR*)my_room, profile->shape) == FALSE) { - return -1; + return aMR_JUDGE_MAX_FTR; } target_ut_x = cur_ut_x; @@ -1975,7 +1975,7 @@ static int aMR_JudgeBreedNewFurniture(GAME* game, u16 ftr_no, int* ut_x, int* ut for (i = 0; i < 5; i++) { angle_idx = (int)angle_idx; if (aMR_WeightPossible((ACTOR*)my_room, profile->shape) == FALSE) { - return -1; + return aMR_JUDGE_MAX_FTR; } target_ut_x = cur_ut_x; @@ -2084,16 +2084,16 @@ static int aMR_JudgeBreedNewFurniture(GAME* game, u16 ftr_no, int* ut_x, int* ut } } - return -2; + return aMR_JUDGE_CANT_PLACE_FTR; } } - return -1; + return aMR_JUDGE_MAX_FTR; } else { *rotation = 0; *square_offset = 0; *layer = 0; - return -3; + return aMR_JUDGE_OTHER_ROOM; } } diff --git a/src/ac_shop_level.c b/src/ac_shop_level.c index 2fd802fc..7db02a45 100644 --- a/src/ac_shop_level.c +++ b/src/ac_shop_level.c @@ -57,7 +57,7 @@ static void aSL_SetShopRenewalChirashi_Notice(int shop_level, lbRTC_time_c* time mHandbill_Load_HandbillFromRom(content->header, &header_back_start, content->footer, content->body, renewal_chirashi_bunmen[shop_level & 3]); content->header_back_start = header_back_start; - content->font = mMl_FONT_0; + content->font = mMl_FONT_RECV; content->paper_type = (u8)ITM_PAPER55; content->mail_type = mMl_TYPE_SHOP_SALE_LEAFLET; mPr_CopyPersonalID(&mail.header.recipient.personalID, &Save_Get(private_data[player_no]).player_ID); diff --git a/src/m_fishrecord.c b/src/m_fishrecord.c index cb5f81f5..0691465c 100644 --- a/src/m_fishrecord.c +++ b/src/m_fishrecord.c @@ -454,7 +454,7 @@ static void mFR_GetFishPresentMail(mFR_record_c* record, Mail_c* mail) { ); mail->content.header_back_start = header_back_start; - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mail->content.mail_type = mMl_TYPE_FISHING_CONTENST; mail->present = present; mail->content.paper_type = 15; // deep sea paper diff --git a/src/m_hand_ovl.c b/src/m_hand_ovl.c index 027dadab..142985ef 100644 --- a/src/m_hand_ovl.c +++ b/src/m_hand_ovl.c @@ -86,7 +86,7 @@ static void mHD_hand_pos_get(Submenu* submenu, f32* pos, int table_type, int tab pos[1] += 23.0f; } } else if ((table_type == mTG_TABLE_GBA || table_type == mTG_TABLE_GBA_NW || table_type == mTG_TABLE_CARD || - table_type == mTG_TABLE_GBA_NW2 || table_type == mTG_TABLE_CPORIGINAL || + table_type == mTG_TABLE_CARD_NW || table_type == mTG_TABLE_CPORIGINAL || table_type == mTG_TABLE_CPORIGINAL_NW) && item != EMPTY_NO) { pos[0] += -2.0f; @@ -178,7 +178,7 @@ static void mHD_drop_item(Submenu* submenu, mTG_tag_c* tag, mActor_name_t* item, table = tag->table; } - if (item != NULL && *item != EMPTY_NO && table != mTG_TABLE_GBA_NW2 && table != mTG_TABLE_GBA_NW) { + if (item != NULL && *item != EMPTY_NO && table != mTG_TABLE_CARD_NW && table != mTG_TABLE_GBA_NW) { now_item = *item; mTG_mark_mainX(submenu, menu_info, table, table_idx, 2, 0); @@ -222,11 +222,11 @@ static void mHD_drop_item(Submenu* submenu, mTG_tag_c* tag, mActor_name_t* item, sAdo_SysTrgStart(NA_SE_41C); if (mail != NULL) { - if (mail->content.font == mMl_FONT_0) { - mail->content.font = mMl_FONT_3; + if (mail->content.font == mMl_FONT_RECV) { + mail->content.font = mMl_FONT_RECV_PLAYER_PRESENT; hand_ovl->info.item_cond = mPr_ITEM_COND_PRESENT; - } else if (mail->content.font == mMl_FONT_2) { - mail->content.font = mMl_FONT_4; + } else if (mail->content.font == mMl_FONT_RECV_READ) { + mail->content.font = mMl_FONT_RECV_PLAYER_PRESENT_READ; hand_ovl->info.item_cond = mPr_ITEM_COND_PRESENT; } } @@ -280,16 +280,16 @@ static void mHD_drop_item(Submenu* submenu, mTG_tag_c* tag, mActor_name_t* item, mTG_mark_mainX(submenu, menu_info, table, table_idx, 2, 0); - if (table == mTG_TABLE_GBA_NW || table == mTG_TABLE_GBA_NW2) { + if (table == mTG_TABLE_GBA_NW || table == mTG_TABLE_CARD_NW) { mGB_copy_image(submenu, hand_ovl->info.item, *item); } else if (item != NULL) { *item = hand_ovl->info.item; if (mail != NULL) { - if (mail->content.font == mMl_FONT_0) { - mail->content.font = mMl_FONT_3; - } else if (mail->content.font == mMl_FONT_2) { - mail->content.font = mMl_FONT_4; + if (mail->content.font == mMl_FONT_RECV) { + mail->content.font = mMl_FONT_RECV_PLAYER_PRESENT; + } else if (mail->content.font == mMl_FONT_RECV_READ) { + mail->content.font = mMl_FONT_RECV_PLAYER_PRESENT_READ; } } } @@ -589,7 +589,7 @@ static void mHD_open_end_proc_item_type17(Submenu* submenu, int idx, int table) } break; case mTG_TABLE_GBA_NW: - case mTG_TABLE_GBA_NW2: + case mTG_TABLE_CARD_NW: tmp_item = RSV_NW_ORIGINAL0 + idx; break; case mTG_TABLE_CPORIGINAL: @@ -664,7 +664,7 @@ static void mHD_open_end_proc_item(Submenu* submenu) { &mHD_open_end_proc_item_type17, /* mTG_TABLE_GBA */ &mHD_open_end_proc_item_type17, /* mTG_TABLE_GBA_NW */ &mHD_open_end_proc_item_type17, /* mTG_TABLE_CARD */ - &mHD_open_end_proc_item_type17, /* mTG_TABLE_GBA_NW2 */ + &mHD_open_end_proc_item_type17, /* mTG_TABLE_CARD_NW */ }; mSM_MenuInfo_c* menu_info; diff --git a/src/m_mail.c b/src/m_mail.c index 046d0ffc..502b2e7a 100644 --- a/src/m_mail.c +++ b/src/m_mail.c @@ -199,7 +199,7 @@ extern int mMl_check_send_mail(Mail_c* mail) { extern int mMl_check_set_present_myself(Mail_c* mail) { u8 font = mail->content.font; - if (font == mMl_FONT_SEND || font == mMl_FONT_3 || font == mMl_FONT_4) { + if (font == mMl_FONT_SEND || font == mMl_FONT_RECV_PLAYER_PRESENT || font == mMl_FONT_RECV_PLAYER_PRESENT_READ) { return TRUE; } @@ -235,7 +235,7 @@ static void mMl_get_mail_to_player_com(Mail_c* mail, PersonalID_c* recipient_pid mMl_clear_mail(mail); (*get_proc[proc_type])(mail, mail_no); - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mail->content.mail_type = mail_type; mPr_CopyPersonalID(&mail->header.recipient.personalID, recipient_pid); diff --git a/src/m_mark_room.c b/src/m_mark_room.c index ef536c33..64905cdf 100644 --- a/src/m_mark_room.c +++ b/src/m_mark_room.c @@ -70,7 +70,7 @@ static int mMkRm_NoMarkLetter(int arrange_idx, int handbill_no) { mMl_clear_mail(&mail); mHandbill_Load_HandbillFromRom(mail.content.header, &header_back_start, mail.content.footer, mail.content.body, handbill_no); - mail.content.font = mMl_FONT_0; + mail.content.font = mMl_FONT_RECV; mail.content.header_back_start = header_back_start; mail.content.mail_type = mMl_TYPE_HRA; mail.content.paper_type = 51; /* wing paper */ diff --git a/src/m_mark_room_ovl.c b/src/m_mark_room_ovl.c index 5290a16c..76587ca2 100644 --- a/src/m_mark_room_ovl.c +++ b/src/m_mark_room_ovl.c @@ -2932,7 +2932,7 @@ static void mMkRm_SendMarkLetter(mHm_hs_c* house, int points, int room_size, u8* mMl_clear_mail(&letter); mHandbill_Load_HandbillFromRom(letter.content.header, &header_back_start, letter.content.footer, letter.content.body, handbill_no); - letter.content.font = mMl_FONT_0; + letter.content.font = mMl_FONT_RECV; letter.content.header_back_start = header_back_start; letter.content.mail_type = mMl_TYPE_HRA; letter.content.paper_type = 51; /* wing paper */ diff --git a/src/m_npc.c b/src/m_npc.c index ae2679b3..1152e890 100644 --- a/src/m_npc.c +++ b/src/m_npc.c @@ -1571,7 +1571,7 @@ static void mNpc_GetRemailData(Mail_c* mail, PersonalID_c* pid, AnmPersonalID_c* int paper_no; (*get_remail[cond])(mail, pid, anm_id, remail, foreign); - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mail->content.mail_type = mMl_TYPE_MAIL; mPr_CopyPersonalID(&mail->header.recipient.personalID, pid); mail->header.recipient.type = mMl_NAME_TYPE_PLAYER; @@ -1680,7 +1680,7 @@ static void mNpc_LoadMailDataCommon2(Mail_c* mail, PersonalID_c* pid, AnmPersona mem_copy(mail->content.header, super, MAIL_HEADER_LEN); mem_copy(mail->content.footer, ps, MAIL_FOOTER_LEN); mail->content.header_back_start = header_back_start; - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mail->content.mail_type = mMl_TYPE_MAIL; mPr_CopyPersonalID(&mail->header.recipient.personalID, pid); mail->header.recipient.type = mMl_NAME_TYPE_PLAYER; @@ -1920,7 +1920,7 @@ static void mNpc_GetXmasCardData(Mail_c* mail, PersonalID_c* pid) { mHandbill_Load_HandbillFromRom(mail->content.header, &header_back_start, mail->content.footer, mail->content.body, 0xD7); mail->content.header_back_start = header_back_start; - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mail->content.mail_type = mMl_TYPE_XMAS; mPr_CopyPersonalID(&mail->header.recipient.personalID, pid); mail->header.recipient.type = mMl_NAME_TYPE_PLAYER; diff --git a/src/m_post_office.c b/src/m_post_office.c index 5fb900d1..ca6f97d7 100644 --- a/src/m_post_office.c +++ b/src/m_post_office.c @@ -164,7 +164,7 @@ static void mPO_delivery_mail_with_item(Mail_c* mail, int mail_no, mActor_name_t mHandbill_Load_HandbillFromRom(mail->content.header, &header_back_start, mail->content.footer, mail->content.body, mail_no); - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mail->content.header_back_start = header_back_start; mail->content.mail_type = 7; mail->content.paper_type = ITM_PAPER55; diff --git a/src/m_quest.c b/src/m_quest.c index 8c82288f..da0e29e5 100644 --- a/src/m_quest.c +++ b/src/m_quest.c @@ -603,7 +603,7 @@ static void mQst_GetRemailData(Mail_c* letter, PersonalID_c* recipient_id, AnmPe mem_copy(letter->content.header, header, MAIL_HEADER_LEN); mem_copy(letter->content.footer, footer, MAIL_FOOTER_LEN); letter->content.header_back_start = header_back_pos; - letter->content.font = mMl_FONT_0; + letter->content.font = mMl_FONT_RECV; letter->content.mail_type = 0; mPr_CopyPersonalID(&letter->header.recipient.personalID, recipient_id); diff --git a/src/m_shop.c b/src/m_shop.c index 21cdb9f6..660ac3dd 100644 --- a/src/m_shop.c +++ b/src/m_shop.c @@ -1094,7 +1094,7 @@ extern void mSP_ShopItsumoChirashi(int house_no, int shop_level, mActor_name_t i mMl_clear_mail(&leaflet); mHandbill_Load_HandbillFromRom(leaflet.content.header, &header_back_start, leaflet.content.footer, leaflet.content.body, rare_chirashi_bunmen[shop_level][type & 1]); - leaflet.content.font = mMl_FONT_0; + leaflet.content.font = mMl_FONT_RECV; leaflet.content.header_back_start = header_back_start; leaflet.content.mail_type = mMl_TYPE_SHOP_SALE_LEAFLET; leaflet.content.paper_type = ITM_PAPER55; // simple paper @@ -1226,7 +1226,7 @@ extern void mSP_SetRenewalChiraswhi_AppoDay() { mMl_clear_mail(&leaflet); mHandbill_Load_HandbillFromRom(content->header, &header_back_start, content->footer, content->body, chirashi_idx_appoday[shop_level]); - leaflet.content.font = mMl_FONT_0; + leaflet.content.font = mMl_FONT_RECV; leaflet.content.header_back_start = header_back_start; leaflet.content.mail_type = mMl_TYPE_SHOP_SALE_LEAFLET; leaflet.content.paper_type = ITM_PAPER55; // simple paper diff --git a/src/m_submenu_ovl.c b/src/m_submenu_ovl.c index 55321ea1..dcb74bfe 100644 --- a/src/m_submenu_ovl.c +++ b/src/m_submenu_ovl.c @@ -1527,7 +1527,7 @@ static void mSM_draw_mail(GRAPH* graph, f32 pos_x, f32 pos_y, f32 scale, Mail_c* if (mMl_check_send_mail(mail)) { type = mSM_MAIL_SEND; - } else if (mail->content.font == mMl_FONT_4 || mail->content.font == mMl_FONT_2) { + } else if (mail->content.font == mMl_FONT_RECV_PLAYER_PRESENT_READ || mail->content.font == mMl_FONT_RECV_READ) { type = mSM_MAIL_NORMAL2; } else { type = mSM_MAIL_NORMAL; diff --git a/src/m_tag_ovl.c b/src/m_tag_ovl.c index 6ef5f79a..1b12983f 100644 --- a/src/m_tag_ovl.c +++ b/src/m_tag_ovl.c @@ -20,6 +20,7 @@ #include "m_mailbox_ovl.h" #include "m_music_ovl.h" #include "m_mark_room.h" +#include "ac_set_ovl_insect.h" static mTG_Ovl_c tag_ovl_data; @@ -123,7 +124,7 @@ static mTG_tag_data_table_c mTG_table_data[] = { { 4, 2, mTG_gba_col_pos, mTG_gba_line_pos }, /* mTG_TABLE_GBA */ { 2, 4, mTG_gba_nw_col_pos, mTG_gba_nw_line_pos }, /* mTG_TABLE_GBA_NW */ { 1, 1, mTG_card_col_pos, mTG_card_line_pos }, /* mTG_TABLE_CARD */ - { 2, 4, mTG_gba_nw_col_pos, mTG_gba_nw_line_pos }, /* mTG_TABLE_GBA_NW2 */ + { 2, 4, mTG_gba_nw_col_pos, mTG_gba_nw_line_pos }, /* mTG_TABLE_CARD_NW */ }; static u8 str_omikuji[7] = "fortune"; @@ -1172,7 +1173,7 @@ static int mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { tag_ovl->ret_tag_idx = ret_idx; } - if (type == mTG_TYPE_NONE) { + if (type == mTG_RETURN_CLOSE) { tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; for (i = tag_ovl->sel_tag_idx - tag_ovl->ret_tag_idx; i != 0; i--) { @@ -2100,7 +2101,7 @@ static void mTG_init_tag_data_item_win(Submenu* submenu) { mTG_init_tag_data_cporiginal_wc_win(submenu); } else if (tag->table == mTG_TABLE_CPORIGINAL_NW || tag->table == mTG_TABLE_NEEDLEWORK || tag->table == mTG_TABLE_CPORIGINAL || tag->table == mTG_TABLE_GBA_NW || - tag->table == mTG_TABLE_CARD || tag->table == mTG_TABLE_GBA_NW2 || tag->table == mTG_TABLE_GBA) { + tag->table == mTG_TABLE_CARD || tag->table == mTG_TABLE_CARD_NW || tag->table == mTG_TABLE_GBA) { mTG_init_tag_data_needlework_win(submenu, idx); } else { tag->arrow_dir = 0; @@ -2767,7 +2768,7 @@ static void mTG_open_warning_window(Submenu* submenu, mSM_MenuInfo_c* menu_info, mSM_open_submenu(submenu, mSM_OVL_WARNING, type, 0); menu_info->proc_status = mSM_OVL_PROC_WAIT; menu_info->next_proc_status = mSM_OVL_PROC_WAIT; - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); sAdo_SysTrgStart(MONO(NA_SE_3)); } @@ -2892,7 +2893,7 @@ static void mTG_catch_item_from_table(Submenu* submenu, Mail_c* mail, mActor_nam } } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_set_catch_se(submenu); } @@ -2928,7 +2929,7 @@ static int mTG_make_money_sack(Submenu* submenu, mSM_MenuInfo_c* menu_info, mAct hand_ovl->info.hold_idx = 0; hand_ovl->info.catch_pg = 0; mTG_mark_main_CLR(submenu, menu_info); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); submenu->overlay->inventory_ovl->disp_money_change_frames = -(amount / 42); sAdo_SysTrgStart(MONO(NA_SE_52)); res = TRUE; @@ -2958,31 +2959,31 @@ static int mTG_drop_furniture(GAME_PLAY* play, mActor_name_t item) { return idx; } -static int mTG_nw_drop_furniture(GAME_PLAY* play, int image_no, mActor_name_t itemNo) { +static int mTG_nw_drop_furniture(GAME_PLAY* play, int type, int image_no) { GAME* game = (GAME*)play; - int idx = -1; + int idx = aMR_JUDGE_MAX_FTR; int sq_ofs; int layer; int ux; int uz; u16 rot; - switch (image_no) { + switch (type) { case mNW_TYPE_MANEKIN: - idx = aMR_CLIP->judge_breed_new_ftr_proc(game, 0x2EA + (itemNo & 7), &ux, &uz, &rot, &sq_ofs, &layer); + idx = aMR_CLIP->judge_breed_new_ftr_proc(game, 0x2EA + (image_no & 7), &ux, &uz, &rot, &sq_ofs, &layer); break; case mNW_TYPE_UMBRELLA: - idx = aMR_CLIP->judge_breed_new_ftr_proc(game, 0x362 + (itemNo & 7), &ux, &uz, &rot, &sq_ofs, &layer); + idx = aMR_CLIP->judge_breed_new_ftr_proc(game, 0x362 + (image_no & 7), &ux, &uz, &rot, &sq_ofs, &layer); break; } if (idx >= 0) { - switch (image_no) { + switch (type) { case mNW_TYPE_MANEKIN: - aMR_CLIP->reserve_ftr_proc(game, 0x2EA + (itemNo & 7), idx, ux, uz, rot, sq_ofs, layer); + aMR_CLIP->reserve_ftr_proc(game, 0x2EA + (image_no & 7), idx, ux, uz, rot, sq_ofs, layer); break; case mNW_TYPE_UMBRELLA: - aMR_CLIP->reserve_ftr_proc(game, 0x362 + (itemNo & 7), idx, ux, uz, rot, sq_ofs, layer); + aMR_CLIP->reserve_ftr_proc(game, 0x362 + (image_no & 7), idx, ux, uz, rot, sq_ofs, layer); break; } } @@ -3051,7 +3052,7 @@ static void mTG_set_trade_cond(Submenu* submenu, mSM_MenuInfo_c* menu_info, s16 Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].exchange_type = cond; Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].extra_data = arg; - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); sAdo_SysTrgStart(NA_SE_33); submenu->overlay->haniwa_ovl->set_interrupt_message_proc(submenu, tag, 4); } @@ -3060,7 +3061,7 @@ static void mTG_present_open_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { int table_idx; table_idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_KEEP); sAdo_SysTrgStart(NA_SE_436); mPr_SetItemCollectBit(Now_Private->inventory.pockets[table_idx]); submenu->overlay->inventory_ovl->item_scale_type[table_idx] = 5; @@ -3188,7 +3189,7 @@ static void mTG_get_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { haniwa_ovl->table_idx = tag->table; haniwa_ovl->sub_idx = tag->tag_col; haniwa_ovl->msg_time = 120; - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); sAdo_SysTrgStart(MONO(NA_SE_3)); } else { haniwa_item_p = &Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col]; @@ -3205,7 +3206,7 @@ static void mTG_get_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { changed_money -= haniwa_item_p->extra_data; if (changed_money < 0) { submenu->overlay->haniwa_ovl->set_interrupt_message_proc(submenu, tag, 7); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); sAdo_SysTrgStart(MONO(NA_SE_3)); } else { inventory_ovl = submenu->overlay->inventory_ovl; @@ -3231,7 +3232,7 @@ static void mTG_get_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { Now_Private->inventory.wallet = keep_money; mPr_SetPossessionItem(Now_Private, idx, haniwa_item_p->item, mPr_ITEM_COND_NORMAL); submenu->overlay->haniwa_ovl->set_interrupt_message_proc(submenu, tag, 8); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); Save_Get(homes[menu_info->data1]).haniwa.bells += haniwa_item_p->extra_data; haniwa_item_p->item = EMPTY_NO; @@ -3274,7 +3275,8 @@ static void mTG_dump_mail_mark_exe_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i Mail_c* mail = &Common_Get(now_home)->mailbox[i]; // clear selected mail if it has a present or is from the player (sending) - if (mail->present != EMPTY_NO || (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4)) { + if (mail->present != EMPTY_NO || + (mail->content.font != mMl_FONT_RECV_READ && mail->content.font != mMl_FONT_RECV_PLAYER_PRESENT_READ)) { mailbox_ovl->mark_bitfield &= ~(1 << i); } } @@ -3289,7 +3291,8 @@ static void mTG_dump_mail_mark_exe_proc(Submenu* submenu, mSM_MenuInfo_c* menu_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) - if (mail->present != EMPTY_NO || (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4)) { + if (mail->present != EMPTY_NO || + (mail->content.font != mMl_FONT_RECV_READ && mail->content.font != mMl_FONT_RECV_PLAYER_PRESENT_READ)) { cpmail_ovl->mark_bitfield &= ~(1 << i); } } @@ -3304,7 +3307,8 @@ static void mTG_dump_mail_mark_exe_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i Mail_c* mail = &Now_Private->mail[i]; // clear selected mail if it has a present or is from the player (sending) - if (mail->present != EMPTY_NO || (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4)) { + if (mail->present != EMPTY_NO || + (mail->content.font != mMl_FONT_RECV_READ && mail->content.font != mMl_FONT_RECV_PLAYER_PRESENT_READ)) { inv_ovl->mail_mark_bitfield2 &= ~(1 << i); } } @@ -3334,7 +3338,7 @@ static void mTG_dump_mail_mark_exe_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i sAdo_SysTrgStart(MONO(NA_SE_A)); } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); } static void mTG_mailbox_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { @@ -3351,7 +3355,7 @@ static void mTG_mailbox_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_ sAdo_SysTrgStart(MONO(NA_SE_A)); } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); } static void mTG_cpmail_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { @@ -3433,14 +3437,14 @@ static void mTG_cpmail_change_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_i sAdo_SysTrgStart(NA_SE_MENU_EXIT); } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); } static void mTG_dump_mail_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; inv_ovl->remove_timer = 24; - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); sAdo_SysTrgStart(NA_SE_435); } @@ -3451,7 +3455,7 @@ static void mTG_dump_item_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { inv_ovl->remove_timer = 12; inv_ovl->item_scale_type[idx] = mIV_ITEM_SCALE_TYPE_SHRINK; - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); sAdo_SysTrgStart(NA_SE_435); } @@ -3461,7 +3465,7 @@ static void mTG_send_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { Mail_c* mail = &Now_Private->mail[idx]; Submenu_Item_c* item_p = submenu->item_p; - mail->content.font = mMl_FONT_0; + mail->content.font = mMl_FONT_RECV; mMl_copy_mail(&submenu->mail, mail); mMl_clear_mail(mail); item_p->slot_no = idx; @@ -3529,7 +3533,7 @@ static void mTG_nw_carpet_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { inv_ovl->original_flag = TRUE; } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); } } @@ -3551,7 +3555,7 @@ static void mTG_carpet_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { *item_p = item; } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); } } @@ -3601,7 +3605,7 @@ static void mTG_nw_cover_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { inv_ovl->original_flag = TRUE; } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); } } @@ -3623,7 +3627,7 @@ static void mTG_cover_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { *item_p = item; } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); } } @@ -3689,7 +3693,7 @@ static void mTG_music_takeout_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) mPr_SetPossessionItem(Now_Private, free_idx, ITM_MINIDISK_START + idx, mPr_ITEM_COND_NORMAL); } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, TRUE); } else { mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MUSIC); @@ -3707,7 +3711,7 @@ static void mTG_music_takeout_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) } } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, TRUE); } else { mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MUSIC); @@ -3776,7 +3780,7 @@ static void mTG_plant_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { mTG_island_check_fruit_plant(plant_item); mPlib_request_main_putin_scoop_from_submenu(&inv_ovl->shovel_pos, Now_Private->inventory.pockets[idx], FALSE); mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, TRUE); return; } else { @@ -3798,7 +3802,7 @@ static void mTG_plant_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f); sAdo_OngenTrgStart(NA_SE_2A, &pos); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, TRUE); return; } @@ -3852,7 +3856,7 @@ static void mTG_field_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { } if (put_cnt != 0) { - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, TRUE); } else if (bad_famicom_cnt != 0) { mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); @@ -3883,7 +3887,7 @@ static void mTG_field_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); } else { if (put_item == ITM_SIGNBOARD) { @@ -3922,7 +3926,7 @@ static void mTG_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { ftrID = mTG_drop_furniture(play, put_item); if (ftrID >= 0) { mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); mMkRm_ReportChangePlayerRoom(); } else { @@ -3956,7 +3960,7 @@ static void mTG_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { } if (cnt > 0) { - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mMkRm_ReportChangePlayerRoom(); mTG_close_window(submenu, menu_info, FALSE); } else { @@ -3969,7 +3973,7 @@ static void mTG_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { if (mFI_Wpos2UtNum(&ux, &uz, ut_pos) && aMR_CLIP->judge_place_2nd_layer_proc(ux, uz) && mTG_common_throw_put_room(play, put_item, &ut_pos, mCoBG_LAYER1, 0)) { mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mTG_close_window(submenu, menu_info, FALSE); mMkRm_ReportChangePlayerRoom(); return; @@ -3980,7 +3984,7 @@ static void mTG_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { if (mTG_search_put_pos(player, &pos, FALSE, FALSE, 0, FALSE, FALSE) && mTG_common_throw_put_room(play, put_item, &pos, mCoBG_LAYER0, 0)) { mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); mMkRm_ReportChangePlayerRoom(); mTG_close_window(submenu, menu_info, FALSE); } else { @@ -4162,7 +4166,7 @@ static void mTG_catch_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { } mTG_catch_item_from_table(submenu, mail_p, item_p, item_cond, cur_tag->table, idx); - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_NONE); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); } } @@ -4347,7 +4351,8 @@ static int mTG_mark_main_sub(Submenu* submenu, int menu_type, int param, int tab if (menu_type == mSM_OVL_MAILBOX) { if (mail->present != EMPTY_NO || - (mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4) || + (mail->content.font != mMl_FONT_RECV_READ && + mail->content.font != mMl_FONT_RECV_PLAYER_PRESENT_READ) || (mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV) { return FALSE; } @@ -4356,7 +4361,8 @@ static int mTG_mark_main_sub(Submenu* submenu, int menu_type, int param, int tab return FALSE; } } else { - if ((mail->content.font != mMl_FONT_2 && mail->content.font != mMl_FONT_4) || + if ((mail->content.font != mMl_FONT_RECV_READ && + mail->content.font != mMl_FONT_RECV_PLAYER_PRESENT_READ) || (mTG_mail_check(mail) & mTG_MAIL_FLAG_RECV) != mTG_MAIL_FLAG_RECV || (mTG_mail_check(mail) & mTG_MAIL_FLAG_PRESENT) == mTG_MAIL_FLAG_PRESENT) { return FALSE; @@ -4622,11 +4628,2049 @@ static void mTG_cancel_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { inv_ovl->mail_mark_flag = 0; } - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_KEEP); sAdo_SysTrgStart(MONO(NA_SE_3)); } } else { - mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_TYPE_FIELD_DEFAULT); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_KEEP); sAdo_SysTrgStart(MONO(NA_SE_3)); } } + +static void mTG_read_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + Mail_c* mail; + + mTG_open_board_init(submenu, menu_info, -1, mSM_BD_OPEN_READ, -1); + mail = mTG_get_mail_pointer(submenu, NULL); + if (mail->content.font == mMl_FONT_RECV_PLAYER_PRESENT) { + mail->content.font = mMl_FONT_RECV_PLAYER_PRESENT_READ; + } else if (mail->content.font == mMl_FONT_RECV) { + mail->content.font = mMl_FONT_RECV_READ; + } + + mPr_SetItemCollectBit(ITM_PAPER_START + mail->content.paper_type); +} + +static void mTG_take_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + Submenu_Item_c* item_p = submenu->item_p; + int idx; + + if (menu_info->data0 == 4) { + idx = menu_info->data1; + } else { + idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + } + + item_p->item = Now_Private->inventory.pockets[idx]; + item_p->slot_no = idx; + submenu->selected_item_num = 1; + + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + + if (menu_info->data0 == 4) { + if (menu_info->data3 == 1) { + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + } else if (ITEM_NAME_GET_TYPE(item_p->item) == NAME_TYPE_ITEM1) { + int category = ITEM_NAME_GET_CAT(item_p->item); + + if (category == ITEM1_CAT_FRUIT || category == ITEM1_CAT_FISH) { + submenu->after_mode = aHOI_REQUEST_EAT; + } else if (category == ITEM1_CAT_CLOTH) { + submenu->after_mode = aHOI_REQUEST_GET_PULL_WAIT; + } else { + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + } + } else { + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + } + } else if (menu_info->data3 == 2) { + submenu->after_mode = aHOI_REQUEST_GET_PULL_WAIT; + } else { + submenu->after_mode = aHOI_REQUEST_PUTAWAY; + } + + mPlib_request_main_give_from_submenu( + item_p->item, submenu->after_mode, + mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, item_p->slot_no) & mPr_ITEM_COND_PRESENT, FALSE); + mTG_close_window(submenu, menu_info, TRUE); +} + +static void mTG_m100_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_make_money_sack(submenu, menu_info, ITM_MONEY_100); +} + +static void mTG_m1000_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_make_money_sack(submenu, menu_info, ITM_MONEY_1000); +} + +static void mTG_m10000_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_make_money_sack(submenu, menu_info, ITM_MONEY_10000); +} + +static void mTG_m30000_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_make_money_sack(submenu, menu_info, ITM_MONEY_30000); +} + +static void mTG_1catch_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + mActor_name_t item = Now_Private->inventory.pockets[idx]; + + mTG_mark_main_CLR(submenu, menu_info); + if (ITEM_IS_WISP(item)) { + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.item = ITM_SPIRIT0; + hand_ovl->info.item_cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + hand_ovl->info.hold_tbl = mTG_TABLE_ITEM; + hand_ovl->info.hold_idx = idx; + hand_ovl->info.catch_pg = 0; + Now_Private->inventory.pockets[idx] = item - 1; + } else if (ITEM_IS_PAPER(item)) { + int paper_idx = item - ITM_PAPER_START; + int paper_item = ITM_PAPER_START + PAPER2TYPE(paper_idx); + + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.item = paper_item; + hand_ovl->info.item_cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + hand_ovl->info.hold_tbl = mTG_TABLE_ITEM; + hand_ovl->info.hold_idx = idx; + hand_ovl->info.catch_pg = 0; + Now_Private->inventory.pockets[idx] = paper_item + (PAPER2STACK(paper_idx) - 1) * PAPER_UNIQUE_NUM; + } else { + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.item = ITM_TICKET_START | (item & (0xF << 3)); + hand_ovl->info.item_cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + hand_ovl->info.hold_tbl = mTG_TABLE_ITEM; + hand_ovl->info.hold_idx = idx; + hand_ovl->info.catch_pg = 0; + Now_Private->inventory.pockets[idx] = item - 1; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + mTG_init_tag_data_item_win(submenu); + sAdo_SysTrgStart(NA_SE_33); +} + +static void mTG_order_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mCL_Ovl_c* catalog_ovl = submenu->overlay->catalog_ovl; + Submenu_Item_c* item_p = submenu->item_p; + mCL_Menu_c* menu_p = &catalog_ovl->menu_data[catalog_ovl->page_order[0]]; + + item_p->item = mRmTp_FtrItemNo2Item1ItemNo(menu_p->item_list[menu_p->top_idx + menu_p->y_idx], TRUE); + submenu->selected_item_num = 1; + if (catalog_ovl->item_data[catalog_ovl->item_data_idx].price == 0) { + item_p->slot_no = 0; + } else { + item_p->slot_no = 1; + } + + mTG_close_window(submenu, menu_info, TRUE); +} + +static void mTG_bury_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + mActor_name_t item = Now_Private->inventory.pockets[idx]; + + mTG_island_check_plant_plant(item); + mTG_island_check_fruit_plant(item); + + if (!mFI_CheckInIsland() || + (!mSP_SearchItemCategoryPriority(item, mSP_KIND_FURNITURE, mSP_LISTTYPE_HOMEPAGE, NULL) && + !mSP_SearchItemCategoryPriority(item, mSP_KIND_FURNITURE, mSP_LISTTYPE_SPECIALPRESENT, NULL))) { + mPlib_request_main_putin_scoop_from_submenu(&inv_ovl->shovel_pos, item, FALSE); + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + mTG_close_window(submenu, menu_info, TRUE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); + } +} + +static void mTG_insect_release_sub(mActor_name_t item, int gold_scoop) { + if (ITEM_IS_WISP(item)) { + mPlib_request_main_release_creature_insect_from_submenu(aSOI_INSECT_TYPE_SPIRIT, gold_scoop); + } else { + mPlib_request_main_release_creature_insect_from_submenu(ITEM_IS_INSECT(item) ? item - ITM_INSECT_START : 0, + gold_scoop); + } +} + +static void mTG_insect_release_demo_gold_scoop(mActor_name_t item) { + mTG_insect_release_sub(item, TRUE); +} + +static void mTG_insect_release(mActor_name_t item) { + mTG_insect_release_sub(item, FALSE); +} + +static void mTG_release_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + mActor_name_t item = Now_Private->inventory.pockets[idx]; + GAME_PLAY* play = (GAME_PLAY*)gamePT; + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + s16 angle_y; + Submenu_Item_c* item_p = submenu->item_p; + + item_p->slot_no = idx; + item_p->item = item; + submenu->selected_item_num = 1; + + if (menu_info->data0 == 13) { + mPr_SetPossessionItem(Now_Private, idx, (mActor_name_t)menu_info->data1, mPr_ITEM_COND_NORMAL); + angle_y = (s16)menu_info->data3; + } else { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + angle_y = player->shape_info.rotation.y; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + mTG_close_window(submenu, menu_info, TRUE); + + if (ITEM_NAME_GET_CAT(item) == ITEM1_CAT_FISH) { + xyz_t_move(&submenu->water_pos, &submenu->overlay->inventory_ovl->release_pos); + mPlib_request_main_release_creature_gyoei_from_submenu(angle_y, item, FALSE); + } else if (ITEM_IS_WISP(item)) { + int wisp_count = ITEM_IS_WISP(item) ? 1 + (item - ITM_SPIRIT0) : 0; + + if (wisp_count >= 2) { + mPr_SetPossessionItem(Now_Private, idx, ITM_SPIRIT0 + (wisp_count - 2), mPr_ITEM_COND_NORMAL); + } else { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, + mPr_ITEM_COND_NORMAL); // @cleanup - we already cleared the item before + } + mTG_insect_release(ITM_SPIRIT0); + } else { + mTG_insect_release(item); + } +} + +static void mTG_fly_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + mActor_name_t item = Now_Private->inventory.pockets[idx]; + // @cleanup - copy-paste leftovers, we don't need player or angle + GAME_PLAY* play = (GAME_PLAY*)gamePT; + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + s16 angle_y; + Submenu_Item_c* item_p = submenu->item_p; + + item_p->slot_no = idx; + item_p->item = item; + submenu->selected_item_num = 1; + + if (menu_info->data0 == 13) { + mPr_SetPossessionItem(Now_Private, idx, (mActor_name_t)menu_info->data1, mPr_ITEM_COND_NORMAL); + angle_y = (s16)menu_info->data3; + } else { + mPr_SetPossessionItem(Now_Private, idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + angle_y = player->shape_info.rotation.y; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + mTG_close_window(submenu, menu_info, TRUE); + + mPlib_request_main_release_creature_balloon_from_submenu(item, FALSE); +} + +static void mTG_exchange_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + GAME_PLAY* play = (GAME_PLAY*)gamePT; + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + int sfx = NA_SE_31; + + if (!mTG_check_hand_condition(submenu)) { + mActor_name_t item = (mActor_name_t)submenu->overlay->hand_ovl->info.item; + int demo_gold_scoop = FALSE; + int type = ITEM_NAME_GET_TYPE(item); + int category = ITEM_NAME_GET_CAT(item); + + mTG_mark_main(submenu, menu_info, mTG_MARK_OFF, NULL); + if (submenu->overlay->hand_ovl->info.item_cond == mPr_ITEM_COND_PRESENT) { + switch (item) { + case ITM_GOLDEN_NET: + item = ITM_GOLDEN_NET_PRESENT; + break; + case ITM_GOLDEN_AXE: + item = ITM_GOLDEN_AXE_PRESENT; + break; + case ITM_GOLDEN_SHOVEL: + item = ITM_GOLDEN_SHOVEL_PRESENT; + break; + case ITM_GOLDEN_ROD: + item = ITM_GOLDEN_ROD_PRESENT; + break; + default: + item = ITM_PRESENT; + break; + } + } + + if (mPlib_Check_golden_item_get_demo_end(mPlayer_GOLDEN_ITEM_TYPE_SHOVEL) == FALSE && + ITEM_IS_GOLD_SCOOP(menu_info->data1) && !ITEM_IS_GOLD_SCOOP(item)) { + demo_gold_scoop = TRUE; + } + + if (type == NAME_TYPE_ITEM1 && category == ITEM1_CAT_FISH) { + mPlib_request_main_release_creature_gyoei_from_submenu((s16)menu_info->data3, item, demo_gold_scoop); + } else if (type == NAME_TYPE_ITEM1 && category == ITEM1_CAT_INSECT) { + if (demo_gold_scoop) { + mTG_insect_release_demo_gold_scoop(item); + } else { + mTG_insect_release(item); + } + } else if (ITEM_IS_BALLOON(item)) { + mPlib_request_main_release_creature_balloon_from_submenu(item, demo_gold_scoop); + } else { + xyz_t pos; + + if (!mFI_CheckInIsland() || + (!mSP_SearchItemCategoryPriority(item, mSP_KIND_FURNITURE, mSP_LISTTYPE_HOMEPAGE, NULL) && + !mSP_SearchItemCategoryPriority(item, mSP_KIND_FURNITURE, mSP_LISTTYPE_SPECIALPRESENT, NULL))) { + if (mTG_search_put_pos(player, &pos, item == ITM_SIGNBOARD, 0, item == ITM_SIGNBOARD, FALSE, + item == ITM_SIGNBOARD) && + mTG_common_throw_put_field(play, item, &pos, mCoBG_LAYER0)) { + if (demo_gold_scoop) { + mPlib_request_main_demo_get_golden_item_from_submenu(); + } else { + mPlib_request_main_wait_from_submenu(); + sfx = -1; + mPlib_request_main_wait_from_submenu(); + } + } else { + if (menu_info->data2 != NULL && + (ITEM_IS_SCOOP(Now_Private->equipment) || ITEM_IS_GOLD_SCOOP(Now_Private->equipment))) { + mTG_island_check_plant_plant(item); + mTG_island_check_fruit_plant(item); + mPlib_request_main_putin_scoop_from_submenu((xyz_t*)menu_info->data2, item, demo_gold_scoop); + } else if (item == ITM_SIGNBOARD) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_SIGN); + return; + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_ITEM); + return; + } + } + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); + return; + } + } + } else { + int demo_gold_scoop = FALSE; + + if (mPlib_Check_golden_item_get_demo_end(mPlayer_GOLDEN_ITEM_TYPE_SHOVEL) == FALSE && + ITEM_IS_GOLD_SCOOP(menu_info->data1)) { + demo_gold_scoop = TRUE; + } + + if (demo_gold_scoop) { + mPlib_request_main_demo_get_golden_item_from_submenu(); + } else { + mPlib_request_main_wait_from_submenu(); + } + } + + submenu->overlay->move_chg_base_proc(menu_info, mSM_MOVE_OUT_RIGHT); + if (sfx >= 0) { + sAdo_SysTrgStart(sfx); + } +} + +static void mTG_hukubukuro_open_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + int free_idx[3]; + mActor_name_t items[3]; + int idx; + int t_idx; + int i; + int j; + int count; + mActor_name_t* item_p; + mIV_Ovl_c* inv_ovl; + mActor_name_t huku_item; + int rng; + int pinwheel_flag; + int rng1; + int rng2; + + item_p = Now_Private->inventory.pockets; + count = 0; + idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++, item_p++) { + if (*item_p == EMPTY_NO) { + free_idx[count++] = i; + if (count == 3) { + break; + } + } + } + + if (count != 3) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_HUKUBUKURO_OPEN); + } else { + inv_ovl = submenu->overlay->inventory_ovl; + huku_item = Now_Private->inventory.pockets[idx]; + inv_ovl->remove_timer = 70; + inv_ovl->item_scale_type[idx] = mIV_ITEM_SCALE_TYPE_SHRINK; + + if (huku_item == ITM_HUKUBUKURO_BAG) { + // Nook sale day grab bag + pinwheel_flag = FALSE; + rng = RANDOM(3) % 3; // @cleanup - why do we modulo 3 when we're already bound to three? + + for (i = 0; i < 3; i++) { + if (i == rng && fqrand() <= 0.5f) { + pinwheel_flag = TRUE; + } + + if (pinwheel_flag) { + int rng2 = RANDOM(8.0f) % 8; // @cleanup - again, why are we taking the modulus here? + + pinwheel_flag = FALSE; + items[i] = ITM_YELLOW_PINWHEEL + rng2; + } else { + int category; + f32 rngf = fqrand(); + + /* Equal 25% chance of the following */ + if (rngf < 0.25f) { + category = mSP_KIND_CLOTH; + } else if (rngf < 0.5f) { + category = mSP_KIND_CARPET; + } else if (rngf < 0.75f) { + category = mSP_KIND_WALLPAPER; + } else { + category = mSP_KIND_FURNITURE; + } + + mSP_SelectRandomItem_New(NULL, &items[i], 1, items, i, category, mSP_LISTTYPE_RARE, FALSE); + } + } + } else { + items[0] = ITM_MINIDISK35; // K.K. Love Song + rng1 = RANDOM(mSP_GC_FAMICOM_TABLE_CNT) % + mSP_GC_FAMICOM_TABLE_CNT; // @cleanup - again with the unnecessary modulus + rng2 = RANDOM(mSP_GC_FAMICOM_TABLE_CNT - 1) % + (mSP_GC_FAMICOM_TABLE_CNT - 1); // @cleanup - tired of repeating myself + if (rng2 >= rng1) { + rng2++; // ensure we don't land on the same famicom twice + } + + items[1] = mSP_gc_famicom_table[rng1]; + items[2] = mSP_gc_famicom_table[rng2]; + } + + /* Give items */ + for (j = 0; j < 3; j++) { + t_idx = free_idx[j]; + mPr_SetPossessionItem(Now_Private, t_idx, items[j], mPr_ITEM_COND_NORMAL); + inv_ovl->item_scale_type[t_idx] = mIV_ITEM_SCALE_TYPE_GROW + j; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + sAdo_SysTrgStart(NA_SE_MENU_EXIT); + } +} + +static void mTG_cp_data_delete_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + // @stubbed - only used in N64 version for controller pak management +} + +static void mTG_nw_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info, int type) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + GAME_PLAY* play = (GAME_PLAY*)gamePT; + // @cleanup - we don't need the player here + ACTOR* player = GET_PLAYER_ACTOR_ACTOR(play); + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + int res = mTG_nw_drop_furniture(play, type, mNW_get_image_no(submenu, idx)); + + if (res >= 0) { + if (inv_ovl != NULL) { + inv_ovl->original_flag = TRUE; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + mTG_close_window(submenu, menu_info, TRUE); + mMkRm_ReportChangePlayerRoom(); + } else if (res == aMR_JUDGE_MAX_FTR) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_MAX_FURNITURE); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FURNITURE); + } +} + +static void mTG_nw_room_put_manekin_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_nw_room_put_proc(submenu, menu_info, mNW_TYPE_MANEKIN); +} + +static void mTG_nw_stk_pat_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[2]; + + switch (tag->tag_row) { + case 2: + mTG_nw_cover_proc(submenu, menu_info); + break; + case 3: + mTG_nw_carpet_proc(submenu, menu_info); + break; + } +} + +static void mTG_tag_remove_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + + if (tag->table == mTG_TABLE_PLAYER) { + mTG_catch_proc(submenu, menu_info); + } +} + +static void mTG_nw_room_put_umbrella_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_nw_room_put_proc(submenu, menu_info, mNW_TYPE_UMBRELLA); +} + +static void mTG_nw_st_umbrella_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; + int idx = mTG_get_table_idx(tag); + + if (mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO) >= 0 || + (ITEM_IS_MYUMBRELLA_TOOL(Now_Private->equipment) || Now_Private->equipment == EMPTY_NO)) { + hand_ovl->info.next_act = mHD_ACTION_SASU2; + hand_ovl->info.item = ITM_MY_ORG_UMBRELLA0 + mNW_get_image_no(submenu, idx); + hand_ovl->info.hold_tbl = mTG_TABLE_NUM; + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_CATCH; + hand_ovl->info.wait_timer = 14; + sAdo_SysTrgStart(NA_SE_5E); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_ORIGINAL); + } +} + +static void mTG_nw_st_wear_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + if (mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO) >= 0 || ITEM_IS_RSVCLOTH(Now_Private->cloth.item)) { + hand_ovl->info.next_act = mHD_ACTION_SASU2; + hand_ovl->info.item = RSV_CLOTH; + hand_ovl->info.hold_tbl = mTG_TABLE_NUM; + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_CHANGE; + sAdo_SysTrgStart(NA_SE_WEAR); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_ORIGINAL); + } +} + +static void mTG_change_original_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mNW_Ovl_c* needlework_ovl = submenu->overlay->needlework_ovl; + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int needlework_mark_num; + int needlework_clear_num; + int cporiginal_mark_num; + int cporiginal_clear_num; + int i; + + needlework_mark_num = 0; + for (i = 0; i < mPr_ORIGINAL_DESIGN_COUNT; i++) { + if (mNW_check_mark_flg(submenu, i)) { + needlework_mark_num++; + } + } + + cporiginal_mark_num = 0; + for (i = 0; i < mCO_ORIGINAL_NUM; i++) { + if (mCO_check_mark_flg(submenu, i)) { + cporiginal_mark_num++; + } + } + + needlework_clear_num = 0; + cporiginal_clear_num = 0; + + if (needlework_mark_num > cporiginal_mark_num) { + needlework_clear_num = needlework_mark_num - cporiginal_mark_num; + } + + if (!(needlework_mark_num > cporiginal_mark_num)) { + cporiginal_clear_num = cporiginal_mark_num - needlework_mark_num; + } + + if (needlework_mark_num == 0 || cporiginal_mark_num == 0) { + needlework_ovl->mark_flg = 0; + cporiginal_ovl->mark_flg = 0; + sAdo_SysTrgStart(MONO(NA_SE_A)); + } else { + mTG_Ovl_c* tag_ovl; + int n; + + if (needlework_clear_num > 0) { + n = 0; + for (i = mPr_ORIGINAL_DESIGN_COUNT - 1; n < needlework_clear_num && i >= 0; i--) { + if (mNW_check_mark_flg(submenu, i)) { + needlework_ovl->mark_flg &= ~(1 << i); + n++; + } + } + } + + if (cporiginal_clear_num > 0) { + n = 0; + for (i = mCO_ORIGINAL_NUM - 1; n < cporiginal_clear_num && i >= 0; i--) { + if (mCO_check_mark_flg(submenu, i)) { + cporiginal_ovl->mark_flg &= ~(1 << i); + n++; + } + } + } + + tag_ovl = submenu->overlay->tag_ovl; + tag_ovl->needlework_mark_flg = needlework_ovl->mark_flg; + tag_ovl->cporiginal_mark_flg = cporiginal_ovl->mark_flg; + tag_ovl->needlework_mark_max = mPr_ORIGINAL_DESIGN_COUNT; + tag_ovl->cporiginal_mark_max = mCO_ORIGINAL_NUM; + tag_ovl->change_original_mark_mode = mTG_CHANGE_ORIGINAL_MARK_DECIDE; + + sAdo_SysTrgStart(NA_SE_MENU_EXIT); + + needlework_ovl->mark_flg = 0; + cporiginal_ovl->mark_flg = 0; + } + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); +} + +static void mTG_mv_priceSet(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + static int add_data[] = { 10000, 1000, 100, 10, 1 }; + u32 trigger = submenu->overlay->menu_control.trigger; + int price = submenu->overlay->haniwa_ovl->price; + + if ((trigger & (BUTTON_B | BUTTON_START | BUTTON_Y)) != 0) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* last_tag = &tag_ovl->tags[tag_ovl->sel_tag_idx - 1]; + + mTG_return_tag_init(submenu, last_tag->type, mTG_RETURN_KEEP); + sAdo_SysTrgStart(MONO(NA_SE_3)); + } else if ((trigger & BUTTON_A) != 0) { + if (price == 0) { + mTG_set_trade_cond(submenu, menu_info, mHm_HANIWA_TRADE_0, 0); + } else { + mTG_set_trade_cond(submenu, menu_info, mHm_HANIWA_TRADE_2, price); + } + } else if ((trigger & (BUTTON_CUP | BUTTON_CDOWN)) != 0) { + if ((trigger & BUTTON_CDOWN) != 0) { + price -= add_data[tag->tag_col]; + if (price < 0) { + price = 0; + } else { + sAdo_SysTrgStart(NA_SE_426); + } + } else { + price += add_data[tag->tag_col]; + if (price > 99999) { + price = 99999; + } else { + sAdo_SysTrgStart(NA_SE_426); + } + } + + submenu->overlay->haniwa_ovl->price = price; + } else if ((trigger & (BUTTON_CLEFT | BUTTON_CRIGHT)) != 0) { + if ((trigger & BUTTON_CLEFT) != 0) { + if (tag->tag_col > 0) { + tag->tag_col--; + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } else { + if (tag->tag_col < 4) { + tag->tag_col++; + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } + } +} + +static void mTG_change_mail(Mail_c* mail_a, Mail_c* mail_b) { + Mail_c tmp_mail; + + mMl_copy_mail(&tmp_mail, mail_a); + mMl_copy_mail(mail_a, mail_b); + mMl_copy_mail(mail_b, &tmp_mail); +} + +static void mTG_change_mail2(s16 field_a, Mail_c* mail_a, s16 field_b, Mail_c* mail_b) { + if (field_a != mTG_MARK_IDX_UNSET && field_b != mTG_MARK_IDX_UNSET) { + mTG_change_mail(mail_a, mail_b); + } +} + +static void mTG_change_mail3(s16 idx0, s16 idx1, Mail_c* mail0, Mail_c* mail1, s16 idx2, s16 idx3, Mail_c* mail2, + Mail_c* mail3) { + if (idx0 < idx1) { + if (idx2 < idx3) { + mTG_change_mail2(idx0, mail0, idx2, mail2); + } else { + mTG_change_mail2(idx0, mail0, idx3, mail3); + mTG_change_mail2(idx0, mail0, idx2, mail2); + } + } else { + if (idx2 < idx3) { + mTG_change_mail2(idx1, mail1, idx2, mail2); + mTG_change_mail2(idx0, mail0, idx2, mail2); + } else { + mTG_change_mail2(idx1, mail1, idx2, mail2); + mTG_change_mail2(idx0, mail0, idx3, mail3); + } + } +} + +static f32 mIV_get_win_posY(Submenu* submenu, mSM_MenuInfo_c* menu_info, int page_idx) { + if (page_idx == submenu->overlay->inventory_ovl->next_page_id) { + return menu_info->position[1]; + } else { + return -menu_info->position[1]; + } +} + +static void mTG_cpack_change_mail_mark_move(Submenu* submenu, mIV_Ovl_c* inv_ovl, mCM_Ovl_c* cpmail_ovl, int mark_idx) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_cpmail_mark_c* cpmail_mark = &tag_ovl->cpmail_mark[mark_idx]; + + if ((cpmail_mark->_4A & 3) == 3) { + int i; + + tag_ovl->_2F4[0]._00 = 0; + tag_ovl->_2F4[1]._00 = 0; + // clang-format off + mTG_change_mail3( + cpmail_mark->idx_tbl[0], cpmail_mark->idx_tbl[1], cpmail_mark->mail_tbl[0], cpmail_mark->mail_tbl[1], + cpmail_mark->idx_tbl[2], cpmail_mark->idx_tbl[3], cpmail_mark->mail_tbl[2], cpmail_mark->mail_tbl[3] + ); + // clang-format on + + if (cpmail_mark->idx_tbl[0] != mTG_MARK_IDX_UNSET) { + inv_ovl->mail_mark_bitfield &= ~(1 << cpmail_mark->idx_tbl[0]); + } + + if (cpmail_mark->idx_tbl[1] != mTG_MARK_IDX_UNSET) { + inv_ovl->mail_mark_bitfield &= ~(1 << cpmail_mark->idx_tbl[1]); + } + + if (cpmail_mark->idx_tbl[2] != mTG_MARK_IDX_UNSET) { + cpmail_ovl->mark_bitfield2 &= ~(1 << cpmail_mark->idx_tbl[2]); + } + + if (cpmail_mark->idx_tbl[3] != mTG_MARK_IDX_UNSET) { + cpmail_ovl->mark_bitfield2 &= ~(1 << cpmail_mark->idx_tbl[3]); + } + + // Clear primary bitfields + if (cpmail_mark->idx_tbl[0] != mTG_MARK_IDX_UNSET) { + inv_ovl->mail_mark_bitfield2 &= ~(1 << cpmail_mark->idx_tbl[0]); + } + + if (cpmail_mark->idx_tbl[2] != mTG_MARK_IDX_UNSET) { + cpmail_ovl->mark_bitfield &= ~(1 << cpmail_mark->idx_tbl[2]); + } + + for (i = 0; i < 4; i++) { + cpmail_mark->idx_tbl[i] = mTG_MARK_IDX_UNSET; + cpmail_mark->mail_tbl[i] = NULL; + } + + sAdo_SysTrgStart(NA_SE_446); + cpmail_mark->mode = mTG_CHANGE_MAIL_MARK_DECIDE; + mTG_init_tag_data_item_win(submenu); + } else { + mTG_cpmail_mark_pos_c* pos_p; + int i; + + add_calc(&tag_ovl->_370, 1.0f, 1.0f - sqrtf(0.5f), 0.175f, 0.005f); + for (i = 0; i < 2; i++) { + pos_p = &tag_ovl->_2F4[i]; + + if ((cpmail_mark->_4A & (1 << i)) != 0) { + pos_p->_00 = 0; + } else { + f32 x0; + f32 y0; + f32 y1; + f32 x1; + f32 tmp; + + x0 = cpmail_mark->_20[i][0]; + y0 = cpmail_mark->_20[i][1]; + x1 = cpmail_mark->_30[i][0]; + y1 = cpmail_mark->_30[i][1]; + tmp = tag_ovl->_370; + + if (1.0f - tmp <= 0.01f) { + pos_p->pos[0] = x1; + pos_p->pos[1] = y1; + cpmail_mark->_4A |= (1 << i); + } else { + pos_p->pos[0] = x0 + (x1 - x0) * tmp; + pos_p->pos[1] = y0 + (y1 - y0) * tag_ovl->_370; + pos_p->_00 = cpmail_mark->_00[i]; + } + } + } + + mTG_init_tag_data_item_win(submenu); + } +} + +static void mTG_cpack_change_mail_mark_decide(Submenu* submenu, mIV_Ovl_c* inv_ovl, mCM_Ovl_c* cpmail_ovl, + int mark_idx) { + static int table_no[] = { mTG_TABLE_MAIL, mTG_TABLE_CPMAIL }; + int k; + int j; + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + s16 inv_move_idx; + s16 cpmail_move_idx; + s16 inv_free_idx; + s16 cpmail_free_idx; + Mail_c* inv_mail; + Mail_c* cpmail_mail; + int cpmail_top_page = cpmail_ovl->page_order[0]; + s16 i; + Mail_c* inv_move_mail; + Mail_c* cpmail_move_mail; + Mail_c* inv_free_mail; + Mail_c* cpmail_free_mail; + mTG_cpmail_mark_c* cpmail_mark; // = &tag_ovl->cpmail_mark[mark_idx]; + s16 mail_idx1[2]; + s16 mail_idx0[2]; + Mail_c* mail_tbl1[2]; + Mail_c* mail_tbl0[2]; + mSM_MenuInfo_c* inv_menu; + mSM_MenuInfo_c* cpmail_menu; + + inv_mail = Now_Private->mail; + inv_move_idx = -1; + inv_free_idx = -1; + inv_move_mail = NULL; + inv_free_mail = NULL; + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++, inv_mail++) { + if (inv_move_idx < 0 && (inv_ovl->mail_mark_bitfield2 & (1 << i)) != 0) { + inv_move_idx = i; + inv_move_mail = inv_mail; + } else if (inv_free_idx < 0 && mMl_check_not_used_mail(inv_mail)) { + inv_free_idx = i; + inv_free_mail = inv_mail; + } + + if (inv_move_idx >= 0 && inv_free_idx >= 0) { + break; + } + } + + cpmail_mail = cpmail_ovl->card_mail->mail[cpmail_top_page]; + cpmail_move_idx = -1; + cpmail_free_idx = -1; + cpmail_move_mail = NULL; + cpmail_free_mail = NULL; + for (i = 0; i < mCM_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; + } else if (cpmail_free_idx < 0 && mMl_check_not_used_mail(cpmail_mail)) { + cpmail_free_mail = cpmail_mail; + cpmail_free_idx = i; + } + + if (cpmail_free_idx >= 0 && cpmail_move_idx >= 0) { + break; + } + } + + if (inv_move_idx < 0) { + cpmail_free_idx = -1; + cpmail_free_mail = NULL; + } + + if (cpmail_move_idx < 0) { + inv_free_idx = -1; + inv_free_mail = NULL; + } + + for (j = 0; j < 2; j++) { + mail_idx1[j] = mTG_MARK_IDX_UNSET; + mail_idx0[j] = mTG_MARK_IDX_UNSET; + mail_tbl1[j] = NULL; + mail_tbl0[j] = NULL; + } + + if (inv_move_idx < 0) { + inv_move_idx = mTG_MARK_IDX_UNSET; + inv_move_mail = NULL; + } + + mail_idx1[0] = inv_move_idx; + mail_idx0[1] = inv_move_idx; + mail_tbl1[0] = inv_move_mail; + mail_tbl0[1] = inv_move_mail; + + if (inv_free_idx >= 0) { + if (inv_free_idx < inv_move_idx) { + mail_idx0[1] = inv_free_idx; + mail_tbl0[1] = inv_free_mail; + } else { + inv_free_idx = mTG_MARK_IDX_UNSET; + inv_free_mail = NULL; + } + } else { + inv_free_idx = mTG_MARK_IDX_UNSET; + inv_free_mail = NULL; + } + + if (cpmail_move_idx < 0) { + cpmail_move_idx = mTG_MARK_IDX_UNSET; + cpmail_move_mail = NULL; + } + + mail_idx1[1] = cpmail_move_idx; + mail_idx0[0] = cpmail_move_idx; + mail_tbl1[1] = cpmail_move_mail; + mail_tbl0[0] = cpmail_move_mail; + + if (cpmail_free_idx >= 0) { + if (cpmail_free_idx < cpmail_move_idx) { + mail_idx0[0] = cpmail_free_idx; + mail_tbl0[0] = cpmail_free_mail; + } else { + cpmail_free_idx = mTG_MARK_IDX_UNSET; + cpmail_free_mail = NULL; + } + } else { + cpmail_free_idx = mTG_MARK_IDX_UNSET; + cpmail_free_mail = NULL; + } + + cpmail_mark = &tag_ovl->cpmail_mark[mark_idx]; + + cpmail_mark->mail_tbl[0] = inv_move_mail; + cpmail_mark->mail_tbl[1] = inv_free_mail; + cpmail_mark->mail_tbl[2] = cpmail_move_mail; + cpmail_mark->mail_tbl[3] = cpmail_free_mail; + + cpmail_mark->idx_tbl[0] = inv_move_idx; + cpmail_mark->idx_tbl[1] = inv_free_idx; + cpmail_mark->idx_tbl[2] = cpmail_move_idx; + cpmail_mark->idx_tbl[3] = cpmail_free_idx; + + tag_ovl->_370 = 0.0f; + cpmail_mark->_4A = 0b11; // 3 + cpmail_mark->mode = mTG_CHANGE_MAIL_MARK_MOVE; + + inv_menu = &submenu->overlay->menu_info[mSM_OVL_INVENTORY]; + cpmail_menu = &submenu->overlay->menu_info[mSM_OVL_CPMAIL]; + + for (k = 0; k < 2; k++) { + if (mail_idx1[k] != mTG_MARK_IDX_UNSET) { + cpmail_mark->_00[k] = mail_tbl1[k]; + cpmail_mark->_00[2 + k] = mail_tbl0[k]; + mTG_set_hand_pos(submenu, cpmail_mark->_20[k], table_no[k], mail_idx1[k]); + mTG_set_hand_pos(submenu, cpmail_mark->_30[k], table_no[1 - k], mail_idx0[k]); + + switch (k) { + case 0: { + cpmail_mark->_20[k][0] += inv_menu->position[0]; + cpmail_mark->_20[k][1] += mIV_get_win_posY(submenu, inv_menu, 1); + cpmail_mark->_30[k][0] += cpmail_menu->position[0]; + cpmail_mark->_30[k][1] += mIV_get_win_posY(submenu, cpmail_menu, 1); + break; + } + case 1: { + cpmail_mark->_20[k][0] += cpmail_menu->position[0]; + cpmail_mark->_20[k][1] += mIV_get_win_posY(submenu, cpmail_menu, 1); + cpmail_mark->_30[k][0] += inv_menu->position[0]; + cpmail_mark->_30[k][1] += mIV_get_win_posY(submenu, inv_menu, 1); + break; + } + } + + switch (k) { + case 0: + inv_ovl->mail_mark_bitfield |= (1 << inv_move_idx); + break; + case 1: + cpmail_ovl->mark_bitfield2 |= (1 << cpmail_move_idx); + } + + cpmail_mark->_4A &= ~(1 << k); + } + } + + mTG_init_tag_data_item_win(submenu); +} + +static int mTG_cpack_change_mail_mark_main(Submenu* submenu, mIV_Ovl_c* inv_ovl, mCM_Ovl_c* cpmail_ovl) { + switch (submenu->overlay->tag_ovl->cpmail_mark[0].mode) { + case mTG_CHANGE_MAIL_MARK_DECIDE: + mTG_cpack_change_mail_mark_decide(submenu, inv_ovl, cpmail_ovl, 0); + // fallthrough + case mTG_CHANGE_MAIL_MARK_MOVE: + mTG_cpack_change_mail_mark_move(submenu, inv_ovl, cpmail_ovl, 0); + break; + } + + return TRUE; +} + +static int mTG_trans_mail_mark(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + Mail_c* src; + + mailbox_ovl->_03++; + if (mailbox_ovl->_03 % 3 == 0) { + int dst_idx = mMl_chk_mail_free_space(Now_Private->mail, mPr_INVENTORY_MAIL_COUNT); + + if (dst_idx != -1) { + int src_idx = 0; + int i; + + for (i = mMB_MAIL_COUNT - 1; i >= 0; i--) { + if ((mailbox_ovl->mark_bitfield & (1 << i)) != 0) { + src_idx = i; + break; + } + } + + src = &Common_Get(now_home)->mailbox[src_idx]; + mMl_copy_mail(&Now_Private->mail[dst_idx], src); + mMl_clear_mail(src); + tag->tag_col = src_idx % 2; + tag->tag_row = src_idx / 2; + mTG_set_hand_pos(submenu, tag->base_pos, tag->table, src_idx); + sAdo_SysTrgStart(NA_SE_446); + mailbox_ovl->mark_bitfield &= ~(1 << src_idx); + mTG_init_tag_data_item_win(submenu); + return TRUE; + } else { + mailbox_ovl->mark_flag = 0; + mailbox_ovl->mark_bitfield = 0; + return TRUE; + } + } + + return mailbox_ovl->open_flag == TRUE; +} + +static int mTG_trans_mail(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + Mail_c* src; + + mailbox_ovl->_03++; + if (mailbox_ovl->_03 % 3 == 0) { + int dst_idx = mMl_chk_mail_free_space(Now_Private->mail, mPr_INVENTORY_MAIL_COUNT); + + if (dst_idx != -1) { + int src_idx = submenu->overlay->mailbox_ovl->get_last_mail_idx_proc(); + + src = &Common_Get(now_home)->mailbox[src_idx]; + mMl_copy_mail(&Now_Private->mail[dst_idx], src); + mMl_clear_mail(src); + src_idx = submenu->overlay->mailbox_ovl->get_last_mail_idx_proc(); + tag->tag_col = src_idx % 2; + tag->tag_row = src_idx / 2; + mTG_set_hand_pos(submenu, tag->base_pos, tag->table, src_idx); + sAdo_SysTrgStart(NA_SE_446); + mTG_init_tag_data_item_win(submenu); + return TRUE; + } + + if (mailbox_ovl->open_flag == TRUE) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MAILBOX); + return TRUE; + } + } + + if (mailbox_ovl->open_flag == TRUE) { + return TRUE; + } + + return FALSE; +} + +static int mTG_check_trans_mail(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int res = FALSE; + + if (mMl_count_use_mail_space(Common_Get(now_home)->mailbox, HOME_MAILBOX_SIZE) != 0) { + res = mTG_trans_mail(submenu, menu_info, tag); + } else { + submenu->overlay->mailbox_ovl->open_flag = FALSE; + } + + return res; +} + +static int mTG_check_trans_mail_mark(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + int res = FALSE; + + if (mailbox_ovl->mark_bitfield != 0) { + res = mTG_trans_mail_mark(submenu, menu_info, tag); + } else { + mailbox_ovl->open_flag = FALSE; + mailbox_ovl->mark_bitfield = 0; + mailbox_ovl->mark_flag = 0; + } + + return res; +} + +static int mTG_cpack_change_mail_mark(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int res = FALSE; + + cpmail_ovl->_BBC++; + if (inv_ovl->mail_mark_bitfield2 != 0 || cpmail_ovl->mark_bitfield != 0) { + res = mTG_cpack_change_mail_mark_main(submenu, inv_ovl, cpmail_ovl); + } else { + inv_ovl->mail_mark_flag = 0; + cpmail_ovl->mark_flag = 0; + } + + return res; +} + +static int mTG_move_cursol_in_cpedit(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + return FALSE; +} + +static int mTG_move_cursol_in_catalog(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + mCL_Ovl_c* catalog_ovl = submenu->overlay->catalog_ovl; + u32 btns = getButton() | getTrigger(); + mCL_Menu_c* catalog_menu = &catalog_ovl->menu_data[catalog_ovl->page_order[0]]; + int target = catalog_menu->top_idx + tag->tag_row; + u32 masked_btns = btns & (BUTTON_CLEFT | BUTTON_CRIGHT | BUTTON_CDOWN | BUTTON_CUP); + int new_target; + int idx; + + if ((masked_btns & BUTTON_CLEFT) != 0) { + if (catalog_menu->top_idx != 0 || tag->tag_row != 0) { + catalog_menu->top_idx = 0; + tag->tag_row = 0; + catalog_ovl->change_flag = TRUE; + } + } else if ((masked_btns & BUTTON_CRIGHT) != 0) { + s16 target = catalog_menu->item_count; + int new_top_idx; + int new_row; + + if (target > 0) { + if (target < mCL_MENU_PAGE_SIZE) { + new_top_idx = 0; + new_row = target - 1; + } else { + new_top_idx = catalog_menu->item_count - mCL_MENU_PAGE_SIZE; + new_row = mCL_MENU_PAGE_SIZE - 1; + } + + if (catalog_menu->top_idx != new_top_idx || tag->tag_row != new_row) { + catalog_menu->top_idx = new_top_idx; + tag->tag_row = new_row; + catalog_ovl->change_flag = TRUE; + } + } + } else if ((trigger & BUTTON_CDOWN) != 0) { + if ((masked_btns & BUTTON_CDOWN) != 0) { + idx = catalog_menu->item_count - mCL_MENU_PAGE_SIZE; + if ((catalog_menu->top_idx + mCL_MENU_PAGE_SIZE) <= idx) { + catalog_menu->top_idx = catalog_menu->top_idx + mCL_MENU_PAGE_SIZE; + catalog_ovl->change_flag = TRUE; + } else if (target < catalog_menu->item_count - 1) { + catalog_menu->top_idx = idx; + if (catalog_menu->top_idx < 0) { + catalog_menu->top_idx = 0; + } + tag->tag_row = (catalog_menu->item_count - catalog_menu->top_idx) - 1; + catalog_ovl->change_flag = TRUE; + } + } else { + if (target < (catalog_menu->item_count - 1)) { + if (tag->tag_row < 5 || (target == (catalog_menu->item_count - 2) && tag->tag_row < 6)) { + tag->tag_row++; + } else { + catalog_menu->top_idx++; + } + + catalog_ovl->change_flag = TRUE; + } + } + } else if ((trigger & BUTTON_CUP) != 0) { + if ((masked_btns & BUTTON_CUP) != 0) { + if ((catalog_menu->top_idx - mCL_MENU_PAGE_SIZE) >= 0) { + catalog_menu->top_idx -= mCL_MENU_PAGE_SIZE; + catalog_ovl->change_flag = TRUE; + } else if (target > 0) { + catalog_menu->top_idx = 0; + tag->tag_row = 0; + catalog_ovl->change_flag = TRUE; + } + } else { + if (target > 0) { + if (tag->tag_row > 1 || (target == 1 && tag->tag_row > 0)) { + tag->tag_row--; + } else { + catalog_menu->top_idx--; + } + + catalog_ovl->change_flag = TRUE; + } + } + } + + return catalog_ovl->change_flag; +} + +static int mTG_move_cursol_base_left(mTG_tag_c* tag) { + int res; + + if (tag->tag_col > 0) { + tag->tag_col--; + res = TRUE; + } else { + res = FALSE; + } + + return res; +} + +static int mTG_move_cursol_base_right(mTG_tag_c* tag) { + int res; + + if (tag->tag_col < (mTG_table_data[tag->table].col_num - 1)) { + tag->tag_col++; + res = TRUE; + } else { + res = FALSE; + } + + return res; +} + +static int mTG_move_cursol_base_upper(mTG_tag_c* tag) { + int res; + + if (tag->tag_row > 0) { + tag->tag_row--; + res = TRUE; + } else { + res = FALSE; + } + + return res; +} + +static int mTG_move_cursol_base_lower(mTG_tag_c* tag) { + int res; + + if (tag->tag_row < (mTG_table_data[tag->table].row_num - 1)) { + tag->tag_row++; + res = TRUE; + } else { + res = FALSE; + } + + return res; +} + +static int mTG_move_check_hand_item_on_player(mActor_name_t item) { + int category = ITEM_NAME_GET_CAT(item); + + return (ITEM_NAME_GET_TYPE(item) == NAME_TYPE_ITEM1 && + (category == ITEM1_CAT_CLOTH || category == ITEM1_CAT_FRUIT || category == ITEM1_CAT_TOOL || + (category == ITEM1_CAT_KABU && item != ITM_KABU_SPOILED))); +} + +static int mTG_move_check_hand_item(Submenu* submenu, int table) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + if (hand_ovl->info.item == EMPTY_NO) { + if (table != mTG_TABLE_BG) { + return TRUE; + } + } else if (hand_ovl->info.item_cond != mPr_ITEM_COND_NORMAL || ITEM_IS_FTR(hand_ovl->info.item)) { + if (table == mTG_TABLE_ITEM || table == mTG_TABLE_MAIL) { + return TRUE; + } + } else { + int category = ITEM_NAME_GET_CAT(hand_ovl->info.item); + + if (table == mTG_TABLE_MONEY) { + if (category == ITEM1_CAT_MONEY) { + return TRUE; + } + } else if (table == mTG_TABLE_BG) { + if (category == ITEM1_CAT_CLOTH) { + return TRUE; + } + } else if (table == mTG_TABLE_PLAYER) { + if (mTG_move_check_hand_item_on_player(hand_ovl->info.item)) { + return TRUE; + } + } else { + return TRUE; + } + } + + return FALSE; +} + +static int mTG_move_cursol_between_table_inventory_left(Submenu* submenu, mTG_tag_c* tag) { + if (tag->table == mTG_TABLE_MAIL) { + if (mMl_check_not_used_mail(&submenu->overlay->hand_ovl->info.mail) == TRUE) { + if (tag->tag_row < 2 && mTG_move_check_hand_item(submenu, mTG_TABLE_MONEY)) { + tag->table = mTG_TABLE_MONEY; + tag->tag_row = 0; + return TRUE; + } else { + tag->table = mTG_TABLE_ITEM; + tag->tag_col = 4; + tag->tag_row--; + if (tag->tag_row < 0) { + tag->tag_row = 0; + } + + return TRUE; + } + } + } else if (tag->table == mTG_TABLE_WCHANGE) { + if (submenu->overlay->inventory_ovl->page_order[0] != mIV_PAGE_INVENTORY) { + tag->table = mTG_TABLE_COLLECT; + tag->tag_col = 7; + if (tag->tag_row == 1) { + tag->tag_row = 2; + } else if (tag->tag_row == 2) { + tag->tag_row = 4; + } + } else { + tag->table = mTG_TABLE_MAIL; + tag->tag_col = 1; + if (tag->tag_row == 0) { + tag->tag_row = 0; + } else if (tag->tag_row == 1) { + tag->tag_row = 2; + } else { + tag->tag_row = 3; + } + } + + return TRUE; + } else if (tag->table == mTG_TABLE_MONEY) { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_PLAYER)) { + tag->table = mTG_TABLE_PLAYER; + return TRUE; + } + } else if (tag->table == mTG_TABLE_ITEM) { + if (mTG_check_hand_condition(submenu) == TRUE) { + tag->table = mTG_TABLE_INVENTORY_WC_ORG; + tag->tag_row = 0; + return TRUE; + } + } else if (tag->table == mTG_TABLE_PLAYER) { + if (mTG_check_hand_condition(submenu) == TRUE) { + tag->table = mTG_TABLE_INVENTORY_WC_ORG; + return TRUE; + } + } else if (tag->table == mTG_TABLE_COLLECT) { + submenu->overlay->hand_ovl->info.move_flag = mHD_MOVE_SWITCH_LEFT; + tag->table = mTG_TABLE_WCHANGE; + if (tag->tag_row == 1) { + tag->tag_row = 0; + } else if (tag->tag_row == 2) { + tag->tag_row = 1; + } else if (tag->tag_row == 3 || tag->tag_row == 4) { + tag->tag_row = 2; + } + + return TRUE; + } else if (tag->table == mTG_TABLE_INVENTORY_WC_ORG) { + tag->table = mTG_TABLE_WCHANGE; + tag->tag_row = 1; + submenu->overlay->hand_ovl->info.move_flag = mHD_MOVE_SWITCH_LEFT; + return TRUE; + } + + return FALSE; +} + +static int mTG_move_cursol_between_table_inventory_right(Submenu* submenu, mTG_tag_c* tag) { + if (tag->table == mTG_TABLE_MONEY) { + tag->table = mTG_TABLE_MAIL; + tag->tag_row = 1; + return TRUE; + } else if (tag->table == mTG_TABLE_ITEM) { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_MAIL)) { + tag->table = mTG_TABLE_MAIL; + tag->tag_col = 0; + tag->tag_row += 2; + return TRUE; + } + } else if (tag->table == mTG_TABLE_MAIL) { + if (mTG_check_hand_condition(submenu) == TRUE) { + tag->table = mTG_TABLE_WCHANGE; + tag->tag_col = 0; + tag->tag_row = (tag->tag_row + 1) >> 1; + return TRUE; + } + } else if (tag->table == mTG_TABLE_COLLECT) { + tag->table = mTG_TABLE_WCHANGE; + tag->tag_col = 0; + if (tag->tag_row > 2) { + tag->tag_row = 2; + } else if (tag->tag_row == 1) { + tag->tag_row = 0; + } else if (tag->tag_row == 2) { + tag->tag_row = 1; + } + + return TRUE; + } else if (tag->table == mTG_TABLE_PLAYER) { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_MONEY)) { + tag->table = mTG_TABLE_MONEY; + return TRUE; + } + } else if (tag->table == mTG_TABLE_WCHANGE) { + if (submenu->overlay->inventory_ovl->page_order[0] != mIV_PAGE_INVENTORY) { + tag->table = mTG_TABLE_COLLECT; + if (tag->tag_row == 1) { + tag->tag_row = 2; + } else if (tag->tag_row == 2) { + tag->tag_row = 4; + } + } else { + tag->table = mTG_TABLE_INVENTORY_WC_ORG; + tag->tag_row = 0; + } + + submenu->overlay->hand_ovl->info.move_flag = mHD_MOVE_SWITCH_RIGHT; + return TRUE; + } else if (tag->table == mTG_TABLE_INVENTORY_WC_ORG) { + tag->table = mTG_TABLE_ITEM; + tag->tag_row = 0; + return TRUE; + } + + return FALSE; +} + +static int mTG_move_cursol_between_table_inventory_upper(Submenu* submenu, mTG_tag_c* tag) { + if (tag->table == mTG_TABLE_BG) { + tag->table = mTG_TABLE_ITEM; + tag->tag_col = 4; + tag->tag_row = 2; + return TRUE; + } else if (tag->table == mTG_TABLE_ITEM) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + int category = ITEM_NAME_GET_CAT(hand_ovl->info.item); + + if (ITEM_NAME_GET_TYPE(hand_ovl->info.item) == NAME_TYPE_ITEM1 && + hand_ovl->info.item_cond == mPr_ITEM_COND_NORMAL) { + if (category == ITEM1_CAT_MONEY) { + tag->table = mTG_TABLE_MONEY; + tag->tag_col = 0; + tag->tag_row = 0; + return TRUE; + } else if (mTG_move_check_hand_item_on_player(hand_ovl->info.item)) { + tag->table = mTG_TABLE_PLAYER; + tag->tag_col = 0; + tag->tag_row = 0; + return TRUE; + } + } + + if (tag->tag_col < 2) { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_PLAYER)) { + tag->table = mTG_TABLE_PLAYER; + tag->tag_col = 0; + tag->tag_row = 0; + return TRUE; + } + } else { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_MONEY)) { + tag->table = mTG_TABLE_MONEY; + tag->tag_col = 0; + tag->tag_row = 0; + return TRUE; + } + } + } else if (tag->table == mTG_TABLE_MONEY) { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_PLAYER)) { + tag->table = mTG_TABLE_MONEY; + return TRUE; + } + } + + return FALSE; +} + +static int mTG_move_cursol_between_table_inventory_lower(Submenu* submenu, mTG_tag_c* tag) { + if (tag->table == mTG_TABLE_ITEM) { + if (tag->tag_col == 4) { + if (mTG_move_check_hand_item(submenu, mTG_TABLE_BG)) { + tag->table = mTG_TABLE_BG; + tag->tag_col = 0; + tag->tag_row = 0; + return TRUE; + } + } + } else if (tag->table == mTG_TABLE_MONEY) { + tag->table = mTG_TABLE_ITEM; + tag->tag_col = 4; + return TRUE; + } else if (tag->table == mTG_TABLE_PLAYER) { + tag->table = mTG_TABLE_ITEM; + return TRUE; + } + + return FALSE; +} + +static int mTG_move_cursol_between_table_cpmail(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + if ((trigger & BUTTON_CLEFT) != 0) { + if (tag->table == mTG_TABLE_CPMAIL_TI || tag->table == mTG_TABLE_CPMAIL) { + tag->tag_col = 1; + tag->table = mTG_TABLE_MAIL; + return TRUE; + } else if (tag->table == mTG_TABLE_CPMAIL_WC) { + tag->table = mTG_TABLE_CPMAIL; + tag->tag_col = 3; + + if (tag->tag_row < 2) { + tag->tag_row = 0; + } else if (tag->tag_row < 4) { + tag->tag_row = 1; + } else if (tag->tag_row < 6) { + tag->tag_row = 2; + } else if (tag->tag_row < 7) { + tag->tag_row = 3; + } else { + tag->tag_row = 4; + } + + if (!mTG_check_hand_condition(submenu)) { + hand_ovl->info.next_act = mHD_ACTION_CLOSE2; + } + + return TRUE; + } + } else if ((trigger & BUTTON_CDOWN) != 0) { + if (tag->table == mTG_TABLE_CPMAIL_TI) { + tag->table = mTG_TABLE_CPMAIL; + tag->tag_row = 0; + tag->tag_col = 0; + return TRUE; + } + } else if ((trigger & BUTTON_CUP) != 0) { + if (mMl_check_not_used_mail(&hand_ovl->info.mail) == TRUE) { + if (tag->table != mTG_TABLE_CPMAIL_TI) { + tag->table = mTG_TABLE_CPMAIL_TI; + tag->tag_col = 0; + tag->tag_row = 0; + return TRUE; + } + } + } else if ((trigger & BUTTON_CRIGHT) != 0) { + if (tag->table == mTG_TABLE_MAIL) { + tag->table = mTG_TABLE_CPMAIL; + tag->tag_col = 0; + return TRUE; + } else if (tag->table == mTG_TABLE_CPMAIL_TI) { + tag->table = mTG_TABLE_CPMAIL_WC; + return TRUE; + } else if (tag->table == mTG_TABLE_CPMAIL) { + tag->table = mTG_TABLE_CPMAIL_WC; + tag->tag_col = 0; + if (tag->tag_row == 0) { + tag->tag_row = 1; + } else if (tag->tag_row == 1) { + tag->tag_row = 3; + } else if (tag->tag_row == 2) { + tag->tag_row = 4; + } else if (tag->tag_row == 3) { + tag->tag_row = 6; + } else { + tag->tag_row = 7; + } + + if (!mTG_check_hand_condition(submenu)) { + hand_ovl->info.next_act = mHD_ACTION_OPEN; + } + + return TRUE; + } + } + + return FALSE; +} + +static int mTG_move_cursol_between_table_music(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + return FALSE; +} + +static int mTG_move_cursol_between_table_haniwa(mTG_tag_c* tag, u32 trigger) { + int res = FALSE; + + if ((trigger & BUTTON_CDOWN) != 0 && tag->table == mTG_TABLE_HANIWA) { + if (tag->tag_col == 3) { + tag->tag_col = 4; + } else { + tag->tag_col += 2; + } + + tag->table = mTG_TABLE_ITEM; + res = TRUE; + } else if ((trigger & BUTTON_CUP) != 0 && tag->table == mTG_TABLE_ITEM) { + tag->table = mTG_TABLE_HANIWA; + if (tag->tag_col < 2) { + tag->tag_col = 0; + } else { + tag->tag_col -= 2; + } + + tag->tag_row = 0; + res = TRUE; + } + return res; +} + +static int mTG_move_cursol_between_table_mailbox(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + int res = FALSE; + + if ((trigger & BUTTON_CLEFT) != 0 && tag->table == mTG_TABLE_MAIL) { + if (mTG_check_hand_condition(submenu)) { + tag->table = mTG_TABLE_MBOX; + tag->tag_col = 1; + res = TRUE; + } + } else if ((trigger & BUTTON_CRIGHT) != 0 && tag->table == mTG_TABLE_MBOX) { + tag->table = mTG_TABLE_MAIL; + tag->tag_col = 0; + res = TRUE; + } + return res; +} + +static int mTG_move_cursol_between_table_catalog(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + int res = FALSE; + + if ((trigger & BUTTON_CLEFT) != 0) { + mCL_Ovl_c* catalog_ovl = submenu->overlay->catalog_ovl; + mCL_Menu_c* catalog_menu = &catalog_ovl->menu_data[catalog_ovl->page_order[0]]; + + if (tag->table == mTG_TABLE_CATALOG_WC) { + if (tag->tag_row >= 4) { + tag->tag_row--; + } + + if (catalog_menu->item_count == 0) { + tag->tag_row = 0; + } else if (catalog_menu->item_count <= tag->tag_row) { + tag->tag_row = catalog_menu->item_count - 1; + } else if (tag->tag_row >= (mCL_MENU_PAGE_SIZE - 1)) { + tag->tag_row = (mCL_MENU_PAGE_SIZE - 1); + } + + tag->table = mTG_TABLE_CATALOG; + catalog_ovl->change_flag = TRUE; + res = TRUE; + } + } else if ((trigger & BUTTON_CRIGHT) != 0) { + if (tag->table == mTG_TABLE_CATALOG) { + tag->table = mTG_TABLE_CATALOG_WC; + if (tag->tag_row >= 3) { + tag->tag_row++; + } + res = TRUE; + } + } + return res; +} + +static int mTG_move_cursol_between_table_cporiginal(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + int res = FALSE; + + if ((trigger & BUTTON_CLEFT) != 0) { + if (tag->table == mTG_TABLE_CPORIGINAL_TI || tag->table == mTG_TABLE_CPORIGINAL) { + tag->tag_col = 1; + tag->table = mTG_TABLE_CPORIGINAL_NW; + res = TRUE; + } else if (tag->table == mTG_TABLE_CPORIGINAL_WC) { + tag->table = mTG_TABLE_CPORIGINAL; + tag->tag_col = 2; + + if (tag->tag_row < 2) { + tag->tag_row = 0; + } else if (tag->tag_row < 4) { + tag->tag_row = 1; + } else if (tag->tag_row < 6) { + tag->tag_row = 2; + } else { + tag->tag_row = 3; + } + + if (!mTG_check_hand_condition(submenu)) { + hand_ovl->info.next_act = mHD_ACTION_CLOSE2; + } + + res = TRUE; + } + } else if ((trigger & BUTTON_CDOWN) != 0) { + if (tag->table == mTG_TABLE_CPORIGINAL_TI) { + tag->table = mTG_TABLE_CPORIGINAL; + tag->tag_row = 0; + tag->tag_col = 0; + res = TRUE; + } + } else if ((trigger & BUTTON_CUP) != 0) { + if (mTG_check_hand_condition(submenu)) { + if (tag->table != mTG_TABLE_CPORIGINAL_TI) { + tag->table = mTG_TABLE_CPORIGINAL_TI; + tag->tag_col = 0; + tag->tag_row = 0; + res = TRUE; + } + } + } else if ((trigger & BUTTON_CRIGHT) != 0) { + if (tag->table == mTG_TABLE_CPORIGINAL_NW) { + tag->table = mTG_TABLE_CPORIGINAL; + tag->tag_col = 0; + res = TRUE; + } else if (tag->table == mTG_TABLE_CPORIGINAL_TI) { + tag->table = mTG_TABLE_CPORIGINAL_WC; + res = TRUE; + } else if (tag->table == mTG_TABLE_CPORIGINAL) { + tag->table = mTG_TABLE_CPORIGINAL_WC; + tag->tag_col = 0; + if (tag->tag_row == 0) { + tag->tag_row = 0; + } else if (tag->tag_row == 1) { + tag->tag_row = 2; + } else if (tag->tag_row == 2) { + tag->tag_row = 4; + } else { + tag->tag_row = 6; + } + + if (!mTG_check_hand_condition(submenu)) { + hand_ovl->info.next_act = mHD_ACTION_OPEN; + } + + res = TRUE; + } + } + + return res; +} + +static int mTG_move_cursol_between_table_gba(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + int res = FALSE; + + if ((trigger & BUTTON_CLEFT) != 0) { + if (tag->table == mTG_TABLE_GBA_NW) { + tag->tag_col = 3; + if (tag->tag_row == 0 || tag->tag_row == 1) { + tag->tag_row = 0; + } else { + tag->tag_row = 1; + } + tag->table = mTG_TABLE_GBA; + res = TRUE; + } + } else if ((trigger & BUTTON_CRIGHT) != 0) { + if (tag->table == mTG_TABLE_GBA) { + tag->tag_col = 0; + if (tag->tag_row == 0) { + tag->tag_row = 1; + } else if (tag->tag_row == 1) { + tag->tag_row = 2; + } + tag->table = mTG_TABLE_GBA_NW; + res = TRUE; + } + } + return res; +} + +static int mTG_move_cursol_between_table_card(Submenu* submenu, mTG_tag_c* tag, u32 trigger) { + int res = FALSE; + + if ((trigger & BUTTON_CLEFT) != 0) { + if (tag->table == mTG_TABLE_CARD_NW) { + tag->tag_col = 0; + tag->tag_row = 0; + tag->table = mTG_TABLE_CARD; + res = TRUE; + } + } else if ((trigger & BUTTON_CRIGHT) != 0) { + if (tag->table == mTG_TABLE_CARD) { + tag->tag_col = 0; + tag->tag_row = 1; + tag->table = mTG_TABLE_CARD_NW; + res = TRUE; + } + } + return res; +} + +static int mTG_move_cursol_between_table_inventory(Submenu* submenu, mTG_tag_c* tag, mSM_MenuInfo_c* menu_info, + u32 trigger) { + int res = FALSE; + + if ((menu_info->menu_type == mSM_OVL_INVENTORY && + (menu_info->data0 == mSM_IV_OPEN_NORMAL || menu_info->data0 == mSM_IV_OPEN_EXCHANGE)) || + (menu_info->menu_type == mSM_OVL_NEEDLEWORK && menu_info->data0 == 1)) { + if ((trigger & BUTTON_CLEFT) != 0) { + res = mTG_move_cursol_between_table_inventory_left(submenu, tag); + } else if ((trigger & BUTTON_CDOWN) != 0) { + res = mTG_move_cursol_between_table_inventory_lower(submenu, tag); + } else if ((trigger & BUTTON_CUP) != 0) { + res = mTG_move_cursol_between_table_inventory_upper(submenu, tag); + } else { + res = mTG_move_cursol_between_table_inventory_right(submenu, tag); + } + } + + return res; +} + +static int mTG_move_cursol_base(Submenu* submenu, mTG_tag_c* tag, mSM_MenuInfo_c* menu_info) { + u32 trigger = submenu->overlay->menu_control.trigger; + int res = FALSE; + + if ((trigger & (BUTTON_CLEFT | BUTTON_CDOWN | BUTTON_CUP | BUTTON_CRIGHT)) != 0 || + (tag->table == mTG_TABLE_CATALOG && + (trigger & (BUTTON_DLEFT | BUTTON_DDOWN | BUTTON_DUP | BUTTON_DRIGHT | BUTTON_CLEFT | BUTTON_CDOWN | + BUTTON_CUP | BUTTON_CRIGHT)) != 0)) { + if (tag->table == mTG_TABLE_CPEDIT) { + res = mTG_move_cursol_in_cpedit(submenu, tag, trigger); + } else if (tag->table == mTG_TABLE_CATALOG) { + res = mTG_move_cursol_in_catalog(submenu, tag, trigger); + } else { + if ((trigger & BUTTON_CLEFT) != 0) { + res = mTG_move_cursol_base_left(tag); + } else if ((trigger & BUTTON_CDOWN) != 0) { + res = mTG_move_cursol_base_lower(tag); + } else if ((trigger & BUTTON_CUP) != 0) { + res = mTG_move_cursol_base_upper(tag); + } else { + res = mTG_move_cursol_base_right(tag); + } + } + + if (res == FALSE) { + /* Process movement between tables */ + if (menu_info->menu_type == mSM_OVL_CPMAIL) { + res = mTG_move_cursol_between_table_cpmail(submenu, tag, trigger); + } else if (menu_info->menu_type == mSM_OVL_HANIWA) { + res = mTG_move_cursol_between_table_haniwa(tag, trigger); + } else if (menu_info->menu_type == mSM_OVL_MAILBOX) { + res = mTG_move_cursol_between_table_mailbox(submenu, tag, trigger); + } else if (menu_info->menu_type == mSM_OVL_CATALOG) { + res = mTG_move_cursol_between_table_catalog(submenu, tag, trigger); + } else if (menu_info->menu_type == mSM_OVL_MUSIC) { + res = mTG_move_cursol_between_table_music(submenu, tag, trigger); + } else if (menu_info->menu_type == mSM_OVL_CPORIGINAL) { + res = mTG_move_cursol_between_table_cporiginal(submenu, tag, trigger); + } else if (menu_info->menu_type == mSM_OVL_GBA) { + switch (menu_info->data0) { + case 3: + res = mTG_move_cursol_between_table_gba(submenu, tag, trigger); + break; + case 4: + res = mTG_move_cursol_between_table_card(submenu, tag, trigger); + break; + } + } else { + res = mTG_move_cursol_between_table_inventory(submenu, tag, menu_info, trigger); + } + } + } + + return res; +} + +static int mTG_select_tag_decide_item_normal(Submenu* submenu, mActor_name_t item, int idx) { + static int tag_type_field[] = { + mTG_TYPE_FIELD_LETTER, // ITEM1_CAT_PAPER + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_MONEY + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_TOOL + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_FISH + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_CLOTH + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_ETC + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_CARPET + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_WALL + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_FRUIT + mTG_TYPE_FIELD_PLANT, // ITEM1_CAT_PLANT + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_MINIDISK + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_DUMMY + mTG_TYPE_FIELD_TICKET, // ITEM1_CAT_TICKET + mTG_TYPE_FIELD_RELEASE, // ITEM1_CAT_INSECT + mTG_TYPE_FIELD_HUKUBUKURO, // ITEM1_CAT_HUKUBUKURO + mTG_TYPE_FIELD_DEFAULT, // ITEM1_CAT_KABU + }; + static int tag_type_my_room[] = { + mTG_TYPE_ROOM_LETTER, // ITEM1_CAT_PAPER + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_MONEY + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_TOOL + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_FISH + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_CLOTH + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_ETC + mTG_TYPE_ROOM_CARPET, // ITEM1_CAT_CARPET + mTG_TYPE_ROOM_WALL, // ITEM1_CAT_WALL + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_FRUIT + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_PLANT + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_MINIDISK + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_DUMMY + mTG_TYPE_ROOM_TICKET, // ITEM1_CAT_TICKET + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_INSECT + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_HUKUBUKURO + mTG_TYPE_ROOM_DEFAULT, // ITEM1_CAT_KABU + }; + static int tag_type_other_room[] = { + mTG_TYPE_OTHER_LETTER, // ITEM1_CAT_PAPER + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_MONEY + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_TOOL + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_FISH + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_CLOTH + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_ETC + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_CARPET + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_WALL + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_FRUIT + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_PLANT + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_MINIDISK + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_DUMMY + mTG_TYPE_CATCH_TICKET, // ITEM1_CAT_TICKET + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_INSECT + mTG_TYPE_OTHER_HUKUBUKURO, // ITEM1_CAT_HUKUBUKURO + mTG_TYPE_CATCH_ITEM, // ITEM1_CAT_KABU + }; + static int* tag_type[] = { + tag_type_field, + tag_type_my_room, + tag_type_other_room, + tag_type_other_room, + }; + static int tag_type_wisp_many[] = { + mTG_TYPE_FIELD_RELEASE, + mTG_TYPE_CATCH_ITEM, + mTG_TYPE_CATCH_ITEM, + mTG_TYPE_CATCH_ITEM, + }; + static int tag_type_wisp_one[] = { + mTG_TYPE_FIELD_RELEASE, + mTG_TYPE_CATCH_ITEM, + mTG_TYPE_CATCH_ITEM, + mTG_TYPE_CATCH_ITEM, + }; + static int tag_type_letters[] = { + mTG_TYPE_FIELD_LETTERS, + mTG_TYPE_ROOM_LETTERS, + mTG_TYPE_OTHER_LETTERS, + mTG_TYPE_OTHER_LETTERS, + }; + + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + u32 item_cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + int type = ITEM_NAME_GET_TYPE(item); + int category = ITEM_NAME_GET_CAT(item); + int ret_tag_type; + + if (inv_ovl->item_mark_bitfield != 0 && (inv_ovl->item_mark_bitfield & (1 << idx)) != 0) { + ret_tag_type = mTG_TYPE_TAG_PUT_ALL; + } else if ((item_cond & mPr_ITEM_COND_PRESENT) != 0) { + ret_tag_type = mTG_TYPE_PRESENT_ITEM; + } else if ((item_cond & mPr_ITEM_COND_QUEST) != 0) { + ret_tag_type = mTG_TYPE_CATCH_ITEM; + } else if (item == ITM_SIGNBOARD && Common_Get(field_type) == mFI_FIELDTYPE2_FG) { + ret_tag_type = mTG_TYPE_FIELD_SIGN; + } else if (ITEM_IS_EXERCISE_CARD(item) || item == ITM_KNIFE_AND_FORK) { + ret_tag_type = mTG_TYPE_TAISOU_CARD; + } else if (type == NAME_TYPE_FTR0 || type == NAME_TYPE_FTR1) { + ret_tag_type = tag_type[Common_Get(field_type)][ITEM1_CAT_CLOTH]; + } else if (ITEM_IS_WISP(item)) { + int wisp_cnt = ITEM_IS_WISP(item) ? (1 + (item - ITM_SPIRIT0)) : 0; + + if (wisp_cnt > 1) { + ret_tag_type = tag_type_wisp_many[Common_Get(field_type)]; + } else { + ret_tag_type = tag_type_wisp_one[Common_Get(field_type)]; + } + } else if (ITEM_IS_PAPER(item)) { + int paper_idx = item - ITM_PAPER_START; + int paper_stack = PAPER2STACK(paper_idx); + + if (paper_stack == 0) { + ret_tag_type = tag_type[Common_Get(field_type)][ITEM1_CAT_PAPER]; + category = ITEM1_CAT_PAPER; // @cleanup - why are we doing this? + } else { + ret_tag_type = tag_type_letters[Common_Get(field_type)]; + } + } else if (ITEM_IS_BALLOON(item)) { + if (Common_Get(field_type) == mFI_FIELDTYPE2_FG) { + ret_tag_type = mTG_TYPE_FIELD_BALLOON; + } else if (Common_Get(field_type) == mFI_FIELDTYPE2_PLAYER_ROOM) { + ret_tag_type = mTG_TYPE_ROOM_DEFAULT; + } else { + ret_tag_type = mTG_TYPE_CATCH_ITEM; + } + } else { + if (category == ITEM1_CAT_TICKET && (item & 7) == 0) { + category = ITEM1_CAT_ETC; + } + + ret_tag_type = tag_type[Common_Get(field_type)][category]; + + /* Don't allow wallpaper & carpet options in the player basement */ + if (Common_Get(field_type) == mFI_FIELDTYPE2_PLAYER_ROOM) { + if (mSc_IS_SCENE_BASEMENT(Save_Get(scene_no)) && + /* @BUG - developers missed a | for || here */ +#ifndef BUGFIXES + (category == ITEM1_CAT_CARPET | category == ITEM1_CAT_WALL)) { +#else + (category == ITEM1_CAT_CARPET || category == ITEM1_CAT_WALL)) { +#endif + ret_tag_type = mTG_TYPE_ROOM_DEFAULT; + } + } + } + + if (inv_ovl != NULL) { + if (type == NAME_TYPE_ITEM1 && category == ITEM1_CAT_FISH && inv_ovl->release_flag == TRUE) { + ret_tag_type = mTG_TYPE_FIELD_RELEASE; + } else if ((ITEM_IS_SCOOP(Now_Private->equipment) || ITEM_IS_GOLD_SCOOP(Now_Private->equipment)) && + inv_ovl->shovel_flag == TRUE && item != ITM_SIGNBOARD && + (type != NAME_TYPE_ITEM1 || category != ITEM1_CAT_INSECT)) { + if (ret_tag_type == mTG_TYPE_FIELD_DEFAULT) { + ret_tag_type = mTG_TYPE_FIELD_DEFAULT_BURY; + } else if (ret_tag_type == mTG_TYPE_FIELD_LETTER) { + ret_tag_type = mTG_TYPE_FIELD_LETTER_BURY; + } else if (ret_tag_type == mTG_TYPE_FIELD_LETTERS) { + ret_tag_type = mTG_TYPE_FIELD_LETTERS_BURY; + } else if (ret_tag_type == mTG_TYPE_FIELD_HUKUBUKURO) { + ret_tag_type = mTG_TYPE_FIELD_HUKUBUKURO_BURY; + } else if (ret_tag_type == mTG_TYPE_FIELD_TICKET) { + ret_tag_type = mTG_TYPE_FIELD_TICKET_BURY; + } + } + } + + if (mEv_CheckFirstJob()) { + if (ret_tag_type == mTG_TYPE_FIELD_PLANT) { + ret_tag_type = mTG_TYPE_FIELD_PLANT_JOB; + } + } + + return ret_tag_type; +} + +// diff --git a/src/save_check.c_inc b/src/save_check.c_inc index 10d6cfa9..70412f8d 100644 --- a/src/save_check.c_inc +++ b/src/save_check.c_inc @@ -172,7 +172,7 @@ static int sChk_font_sub(u8* font_p) { int res = FALSE; /* This check seems wrong lol */ - if (font != 0xFF && (font >= 0xFF || font >= mMl_FONT_NUM || font < mMl_FONT_0)) { + if (font != 0xFF && (font >= 0xFF || font >= mMl_FONT_NUM || font < mMl_FONT_RECV)) { mFRm_ERRORLINE(612); res = TRUE; } From 3e45bc51c5fdd0e0290a144ef6a965197dc8e618 Mon Sep 17 00:00:00 2001 From: Cuyler36 <24523422+Cuyler36@users.noreply.github.com> Date: Mon, 21 Oct 2024 21:29:51 -0400 Subject: [PATCH 8/8] m_tag_ovl 100% --- config/rel_slices.yml | 5 + include/audio_defs.h | 5 +- include/m_collision_bg.h | 4 + include/m_cpmail_ovl.h | 5 +- include/m_cporiginal_ovl.h | 3 + include/m_editEndChk_ovl.h | 2 +- include/m_inventory_ovl.h | 6 +- include/m_name_table.h | 5 + include/m_needlework_ovl.h | 1 + include/m_submenu.h | 2 +- include/m_tag_ovl.h | 60 +- src/m_hand_ovl.c | 2 +- src/m_inventory_ovl.c | 4 +- src/m_tag_ovl.c | 2320 +++++++++++++++++++++++++++++++++++- 14 files changed, 2342 insertions(+), 82 deletions(-) diff --git a/config/rel_slices.yml b/config/rel_slices.yml index cd283201..6e2ae4fb 100644 --- a/config/rel_slices.yml +++ b/config/rel_slices.yml @@ -1090,6 +1090,11 @@ m_submenu_ovl.c: .rodata: [0x8064B870, 0x8064B900] .data: [0x806CE550, 0x806CF928] .bss: [0x813405C0, 0x81340FC8] +m_tag_ovl.c: + .text: [0x805EF6CC, 0x805FF3C4] + .rodata: [0x8064B900, 0x8064BA00] + .data: [0x806CF928, 0x806D1320] + .bss: [0x81340FC8, 0x81341390] m_timeIn_ovl.c: .text: [0x805FF3C4, 0x80600370] .rodata: [0x8064BA00, 0x8064BA58] diff --git a/include/audio_defs.h b/include/audio_defs.h index d56c3a82..5a96fd07 100644 --- a/include/audio_defs.h +++ b/include/audio_defs.h @@ -46,7 +46,7 @@ typedef enum audio_sound_effects { NA_SE_MENU_PAUSE = 0x30, NA_SE_31 = 0x31, - + NA_SE_32 = 0x32, NA_SE_33 = 0x33, NA_SE_DRAWER_SHUT = 0x3A, @@ -182,6 +182,9 @@ typedef enum audio_sound_effects { NA_SE_SCOOP_ITEM_HIT, NA_SE_AXE_BALL_HIT, + NA_SE_45E = 0x45E, + NA_SE_45F = 0x45F, + NA_SE_461 = 0x461, NA_SE_COIN_GASAGOSO = 0x465, diff --git a/include/m_collision_bg.h b/include/m_collision_bg.h index 6967ece4..6292ecf9 100644 --- a/include/m_collision_bg.h +++ b/include/m_collision_bg.h @@ -344,6 +344,10 @@ extern void mCoBG_GroundCheckOnly(xyz_t* reverse_pos, ACTOR* actor, f32 check_ra extern f32 mCoBG_Wpos2BgUtCenterHeight_AddColumn(xyz_t pos); extern f32 mCoBG_UtNum2UtCenterY_Keep(int ut_x, int ut_z); extern int mCoBG_RegistDecalCircle(const xyz_t* pos_p, f32 radius_start, f32 radius_end, s16 timer); +extern int mCoBG_CheckAcceptDesignSign(const xyz_t* pos_p); +extern void mCoBG_VirtualBGCheck(xyz_t* rev_pos_p, mCoBG_Check_c* bg_check, const xyz_t* start_pos_p, + const xyz_t* end_pos_p, s16 angle_y, s16 water_flag, s16 ground_flag, f32 range, + f32 ground_dist, s16 attr_wall, s16 rev_type, s16 check_type); typedef int (*mCoBG_LINECHECK_PROC)(mActor_name_t); diff --git a/include/m_cpmail_ovl.h b/include/m_cpmail_ovl.h index b9d1ea4e..6c42be56 100644 --- a/include/m_cpmail_ovl.h +++ b/include/m_cpmail_ovl.h @@ -12,6 +12,7 @@ extern "C" { #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 { @@ -24,12 +25,12 @@ struct cpmail_ovl_s { mCD_mail_c* card_mail; Mail_c player_mail[mPr_INVENTORY_MAIL_COUNT]; u8 page_order[mCM_PAGE_COUNT]; - u32 _BB0; + s16 page_move_timer; + u8 next_page_id; u32 mark_bitfield; int mark_flag; u8 _BBC; u32 mark_bitfield2; - // u8 _BBC[0xBC4 - 0xBBC]; }; extern void mCM_cpmail_ovl_construct(Submenu* submenu); diff --git a/include/m_cporiginal_ovl.h b/include/m_cporiginal_ovl.h index fe70dd30..e8660ada 100644 --- a/include/m_cporiginal_ovl.h +++ b/include/m_cporiginal_ovl.h @@ -12,6 +12,7 @@ extern "C" { #define mCO_PAGE_NUM 8 #define mCO_ORIGINAL_NUM 12 #define mCO_FOLDER_NAME_LEN 12 +#define mCO_FOLDER_NAME_MAX_WIDTH 120 /* TODO: find a better place for this */ typedef struct card_original_s { @@ -36,10 +37,12 @@ struct cporiginal_s { }; 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_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); extern int mCO_check_mark_flg(Submenu* submenu, int idx); +extern void mCO_clear_mark_flg(Submenu* submenu); extern int mCO_check_hide_flg(Submenu* submenu, int folder, int idx); extern void mCO_on_hide_flg(Submenu* submenu, int folder, int idx); extern void mCO_clear_hide_flg(Submenu* submenu); diff --git a/include/m_editEndChk_ovl.h b/include/m_editEndChk_ovl.h index dbcbf760..4be9c3dc 100644 --- a/include/m_editEndChk_ovl.h +++ b/include/m_editEndChk_ovl.h @@ -14,7 +14,7 @@ enum { mEE_TYPE_BOARD, mEE_TYPE_NOTICE, mEE_TYPE_MSCORE, - mEE_TYPE_CPORIGINAL, + mEE_TYPE_CPACK, mEE_TYPE_ORIGINAL_DESIGN, mEE_TYPE_NUM diff --git a/include/m_inventory_ovl.h b/include/m_inventory_ovl.h index d9cd9cce..9f975427 100644 --- a/include/m_inventory_ovl.h +++ b/include/m_inventory_ovl.h @@ -15,6 +15,10 @@ extern "C" { #define mIV_ITEM_JOINT_NUM 8 #define mIV_PLAYER_EFFECT_NUM 20 #define mIV_COLLECT_NUM 40 +#define mIV_ITEM_COLUMNS 5 +#define mIV_ITEM_ROWS 3 +#define mIV_MAIL_COLUMNS 2 +#define mIV_MAIL_ROWS 5 enum { mIV_ITEM_SCALE_TYPE_NONE, @@ -80,7 +84,7 @@ struct inventory_ovl_s { u16 selectable_mail_bitfield; u32 disp_money; - int disp_money_change_frames; + int disp_money_chg_step; xyz_t shovel_pos; xyz_t release_pos; diff --git a/include/m_name_table.h b/include/m_name_table.h index 97d2c389..96831d2b 100644 --- a/include/m_name_table.h +++ b/include/m_name_table.h @@ -207,6 +207,10 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define NPC_HOUSE_ID_TO_NPC_ID(house) (house + 0x9000) #define NPC_ID_TO_NPC_HOUSE_ID(npc) (npc - 0x9000) +#define TICKET_MONTH(n) (1 + (((n) >> 3) & 0xF)) +#define TICKET_COUNT(n) (1 + ((n) & 7)) +#define WISP_COUNT(n) (ITEM_IS_WISP(n) ? (1 + (n) - ITM_SPIRIT0) : 0) + #define ITEM_IS_INSECT(n) ((n) >= ITM_INSECT_START && (n) < ITM_INSECT_END) #define ITEM_IS_WISP(n) ((n) >= ITM_SPIRIT0 && (n) <= ITM_SPIRIT4) #define ITEM_IS_PAPER(n) ((n) >= ITM_PAPER_START && (n) <= (ITM_PAPER_END - 1)) @@ -531,6 +535,7 @@ extern int mNT_check_unknown(mActor_name_t item_no); #define ITEM_IS_EXERCISE_CARD(item) ((item) >= ITM_EXCERCISE_CARD00 && (item) <= ITM_EXCERCISE_CARD12) #define ITEM_IS_BALLOON(item) ((item) >= ITM_BALLOON_START && (item) <= ITM_BUNNY_O_BALLOON) #define ITEM_IS_UMBRELLA(item) ((item) >= ITM_UMBRELLA_START && (item) <= ITM_UMBRELLA_END) +#define ITEM_IS_UMBRELLA2(item) ((item) >= ITM_UMBRELLA_START && (item) <= ITM_MY_ORG_UMBRELLA7) #define ITEM_IS_MYUMBRELLA_TOOL(item) ((item) >= ITM_MY_ORG_UMBRELLA0 && (item) <= ITM_MY_ORG_UMBRELLA7) #define ITEM_IS_SCOOP(item) ((item) >= ITM_SHOVEL && (item) <= ITM_SHOVEL) #define ITEM_IS_GOLD_SCOOP(item) ((item) >= ITM_GOLDEN_SHOVEL && (item) <= ITM_GOLDEN_SHOVEL) diff --git a/include/m_needlework_ovl.h b/include/m_needlework_ovl.h index 3d845af1..e6fff131 100644 --- a/include/m_needlework_ovl.h +++ b/include/m_needlework_ovl.h @@ -23,6 +23,7 @@ extern int mNW_check_hide_flg(Submenu* submenu, int idx); extern int mNW_check_mark_flg(Submenu* submenu, int idx); extern void mNW_on_hide_flg(Submenu* submenu, int idx); extern void mNW_clear_hide_flg(Submenu* submenu); +extern void mNW_clear_mark_flg(Submenu* submenu); extern void mNW_draw_original(Submenu* submenu, GRAPH* graph, f32 pos_x, f32 pos_y, f32 scale, int idx, int color_flag); extern void mNW_needlework_ovl_construct(Submenu* submenu); diff --git a/include/m_submenu.h b/include/m_submenu.h index 9010a1c5..3742a387 100644 --- a/include/m_submenu.h +++ b/include/m_submenu.h @@ -105,7 +105,7 @@ enum { mSM_IV_OPEN_EXCHANGE, mSM_IV_OPEN_CPMAIL, mSM_IV_OPEN_CURATOR, - mSM_IV_OPEN_16, + mSM_IV_OPEN_PASSWORD, mSM_IV_OPEN_NUM }; diff --git a/include/m_tag_ovl.h b/include/m_tag_ovl.h index fd773e10..cf946b2a 100644 --- a/include/m_tag_ovl.h +++ b/include/m_tag_ovl.h @@ -177,6 +177,22 @@ enum { mTG_TABLE_NUM }; +enum { + mTG_WIN_ITEM, + mTG_WIN_QITEM, + mTG_WIN_SELECT, + + mTG_WIN_NUM +}; + +enum { + mTG_STR0, + mTG_STR1, + mTG_STR2, + + mTG_STR_NUM +}; + #define mTG_RETURN_CLOSE 0 #define mTG_RETURN_KEEP 1 @@ -227,14 +243,34 @@ typedef struct tag_cpmail_mark_s { s16 _4A; } mTG_cpmail_mark_c; +enum { + mTG_ORG_TYPE_NW, + mTG_ORG_TYPE_CO, + + mTG_ORG_TYPE_NUM +}; + typedef struct tag_cporiginal_mark_s { - f32 _00[2][2]; - f32 _10[2][2]; - s16 needlework_idx; - s16 cporiginal_idx; + f32 _00[mTG_ORG_TYPE_NUM][2]; + f32 _10[mTG_ORG_TYPE_NUM][2]; + s16 idx[mTG_ORG_TYPE_NUM]; } mTG_cporiginal_mark_c; -/* TODO */ +typedef struct tag_cporiginal_mark_entry_s { + mActor_name_t item; + float pos[2]; +} mTG_cporiginal_mark_entry_c; + +/* sizeof(mTG_mark_original_c) == 0x34 */ +typedef struct tag_mark_original_s { + /* 0x00 */ mTG_cporiginal_mark_c mark[1]; + /* 0x24 */ f32 move_percent; + /* 0x28 */ u16 mark_flg[mTG_ORG_TYPE_NUM]; + /* 0x2C */ s16 mark_max[mTG_ORG_TYPE_NUM]; + /* 0x30 */ s16 mark_mode; +} mTG_mark_original_c; + +/* sizeof(mTG_Ovl_c) == 0x3C4 */ struct tag_ovl_s { /* 0x000 */ int sel_tag_idx; /* 0x004 */ int ret_tag_idx; @@ -249,16 +285,10 @@ struct tag_ovl_s { /* 0x2F4 */ mTG_cpmail_mark_pos_c _2F4[4]; /* 0x324 */ mTG_cpmail_mark_c cpmail_mark[1]; /* 0x370 */ f32 _370; - /* 0x374 */ int _374; - /* 0x378 */ mActor_name_t _378[2]; - /* 0x37C */ int _37C[5]; - /* 0x390 */ mTG_cporiginal_mark_c cporiginal_mark[1]; - /* 0x3B4 */ f32 _3B4; - /* 0x3B8 */ u16 needlework_mark_flg; - /* 0x3BA */ u16 cporiginal_mark_flg; - /* 0x3BC */ s16 needlework_mark_max; - /* 0x3BE */ s16 cporiginal_mark_max; - /* 0x3C0 */ s16 change_original_mark_mode; + /* 0x374 */ u16 nw_gba_flags; + /* 0x376 */ u16 _02; + /* 0x378 */ mTG_cporiginal_mark_entry_c original_entries[mTG_ORG_TYPE_NUM]; + /* 0x390 */ mTG_mark_original_c original_mark; }; extern int mTG_mark_main(Submenu*, mSM_MenuInfo_c*, int, int*); diff --git a/src/m_hand_ovl.c b/src/m_hand_ovl.c index 142985ef..d89cb5cb 100644 --- a/src/m_hand_ovl.c +++ b/src/m_hand_ovl.c @@ -452,7 +452,7 @@ static void mHD_open_sack(Submenu* submenu) { hand_ovl->info.next_act = mHD_ACTION_SASU; hand_ovl->info.wait_timer = 42; sAdo_SysTrgStart(MONO(NA_SE_52)); - submenu->overlay->inventory_ovl->disp_money_change_frames = amount / 42; + submenu->overlay->inventory_ovl->disp_money_chg_step = amount / 42; } static void mHD_drop_mail(Submenu* submenu, Mail_c* mail) { diff --git a/src/m_inventory_ovl.c b/src/m_inventory_ovl.c index b30d6c55..fed22d4b 100644 --- a/src/m_inventory_ovl.c +++ b/src/m_inventory_ovl.c @@ -1259,7 +1259,7 @@ static void mIV_move_Play(Submenu* submenu, mSM_MenuInfo_c* menu_info) { case mSM_IV_OPEN_MINIDISK: case mSM_IV_OPEN_SHRINE: case mSM_IV_OPEN_CURATOR: - case mSM_IV_OPEN_16: + case mSM_IV_OPEN_PASSWORD: submenu->overlay->tag_ovl->chg_tag_func_proc(submenu, mTG_TABLE_ITEM, mTG_TYPE_NONE, unselected_num, 0.0f, 0.0f); break; @@ -1992,7 +1992,7 @@ static void mIV_inventory_ovl_init(Submenu* submenu, mSM_MenuInfo_c* menu_info, break; } - case mSM_IV_OPEN_16: { + case mSM_IV_OPEN_PASSWORD: { inv_ovl->selectable_item_bitfield = menu_info->data1; inv_ovl->selectable_mail_bitfield = 0; break; diff --git a/src/m_tag_ovl.c b/src/m_tag_ovl.c index 1b12983f..0e731604 100644 --- a/src/m_tag_ovl.c +++ b/src/m_tag_ovl.c @@ -21,6 +21,30 @@ #include "m_music_ovl.h" #include "m_mark_room.h" #include "ac_set_ovl_insect.h" +#include "m_editor_ovl.h" +#include "m_editEndChk_ovl.h" +#include "sys_matrix.h" +#include "m_roll_lib.h" +#include "m_house.h" + +static void mTG_mark_main_CLR(Submenu* submenu, mSM_MenuInfo_c* menu_info); + +enum { + mTG_QSTR_TYPE_NONE, + mTG_QSTR_TYPE_ITEM, + mTG_QSTR_TYPE_MAIL, + mTG_QSTR_TYPE_FROM_MUSEUM, + mTG_QSTR_TYPE_TO_MUSEUM, + mTG_QSTR_TYPE_XMAS_SNOWMAN_SPNPC, + mTG_QSTR_TYPE_SHOP, + mTG_QSTR_TYPE_MOTHER, + mTG_QSTR_TYPE_ANGLER, + mTG_QSTR_TYPE_OMIKUJI, + mTG_QSTR_TYPE_POST_OFFICE, + mTG_QSTR_TYPE_HAPPY_ROOM, + + mTG_QSTR_TYPE_NUM +}; static mTG_Ovl_c tag_ovl_data; @@ -132,7 +156,7 @@ static u8 str_happy_room[7] = "the HRA"; static u8 postoffice_str[15] = "the post office"; static u8 mother_str[4] = "home"; static u8 str_otodokemono[12] = "Delivery for"; -static u8 str_otegami[9] = "letter to"; +static u8 str_otegami[9] = "Letter to"; static u8 str_title0[5] = "to\xD3 "; static u8 str_title1[5] = "from\xD3"; static u8 str_title2[5] = "'s "; @@ -179,6 +203,7 @@ static void mTG_take_proc(Submenu*, mSM_MenuInfo_c*); static void mTG_m100_proc(Submenu*, mSM_MenuInfo_c*); static void mTG_m1000_proc(Submenu*, mSM_MenuInfo_c*); static void mTG_m10000_proc(Submenu*, mSM_MenuInfo_c*); +static void mTG_m30000_proc(Submenu*, mSM_MenuInfo_c*); static void mTG_1catch_proc(Submenu*, mSM_MenuInfo_c*); static void mTG_order_proc(Submenu*, mSM_MenuInfo_c*); static void mTG_bury_proc(Submenu*, mSM_MenuInfo_c*); @@ -340,6 +365,11 @@ static mTG_tag_word_c mTG_tag_word_10000 = { &mTG_m10000_proc, }; +static mTG_tag_word_c mTG_tag_word_30000 = { + "30000 ", + &mTG_m30000_proc, +}; + static mTG_tag_word_c mTG_tag_word_okane = { "Price\xD3:\xD3\xD3\xD3\xD3\xD3\xD3\xD3 ", NULL, @@ -751,6 +781,17 @@ static mTG_tag_word_c* mTG_dump_item[] = { &mTG_tag_word_yameru, }; +static mTG_tag_word_c* mTG_money_sack1[] = { + &mTG_tag_word_100, + &mTG_tag_word_yameru, +}; + +static mTG_tag_word_c* mTG_money_sack2[] = { + &mTG_tag_word_100, + &mTG_tag_word_1000, + &mTG_tag_word_yameru, +}; + static mTG_tag_word_c* mTG_money_sack3[] = { &mTG_tag_word_100, &mTG_tag_word_1000, @@ -758,6 +799,10 @@ static mTG_tag_word_c* mTG_money_sack3[] = { &mTG_tag_word_yameru, }; +static mTG_tag_word_c* mTG_money_sack4[] = { + &mTG_tag_word_100, &mTG_tag_word_1000, &mTG_tag_word_10000, &mTG_tag_word_30000, &mTG_tag_word_yameru, +}; + static mTG_tag_word_c* mTG_quest_item[] = { &mTG_tag_word_watasu, &mTG_tag_word_yameru, @@ -1189,8 +1234,8 @@ static int mTG_return_tag_init(Submenu* submenu, int ret_type, int type) { return ret_idx; } -static u16 mTG_get_item_name_wait_time(mTG_tag_c* tag) { - u16 time; +static s16 mTG_get_item_name_wait_time(mTG_tag_c* tag) { + s16 time; tag->scale = 0.0f; if (tag->table == mTG_TABLE_CATALOG_WC) { @@ -1315,6 +1360,16 @@ static void mTG_set_tag_win_scale_p(mTG_tag_c* tag, int win_type, f32 x, f32 y) { 4.375f, -2.625f }, &tag_win_data_pix_arrow_offset_item, }, + { + { 0.5217391f, 0.88235295f }, + { -92.0f, 34.0f }, + 1.0f, + 52.5f, + 67.5f, + { 22.0f, -12.0f }, + { 10.0f, -4.0f }, + &tag_win_data_pix_arrow_offset_quest, + }, { { 0.5714286f, 0.43243244f }, { -61.25f, 64.75f }, @@ -1371,7 +1426,7 @@ static int mTG_check_edge_right_item(mTG_tag_c* tag) { f32 edge; int res = FALSE; - if (tag->str2_type == 0) { + if (tag->str2_type == mTG_QSTR_TYPE_NONE) { edge = 64.75f; } else { edge = 92.0f; @@ -1403,6 +1458,20 @@ static int mTG_check_edge_right_select(mTG_tag_c* tag, f32* right_edge) { return res; } +/* @unused @fabricated */ +static int mTG_check_edge_left_select(mTG_tag_c* tag, f32* left_edge) { + f32 margin = tag->body_scale[0] * 122.5f * 0.5f; + int res = FALSE; + + *left_edge = (tag->base_pos[0] + tag->body_ofs[0] - margin) - -134.0f; + + if (*left_edge <= 0.0f) { + res = TRUE; + } + + return res; +} + static int mTG_check_edge_foot_select(mTG_tag_c* tag) { f32 margin = (tag->body_scale[1] * 129.5f) * 0.5f; f32 tmp; @@ -1539,7 +1608,7 @@ static int mTG_strcpy(u8* dst, u8* src, int dst_max, int src_max) { static int mTG_strcat_color(u8* str, u8* src, int str_max, int src_max, rgba_t* color) { /* 0x7F 0x05 0x00 0x00 0x00 0x00 */ - static u8 font_color_base[] = { CHAR_CONTROL_CODE, mFont_CONT_CODE_COLOR, 0, 0, 0, 0 }; + static u8 font_color_base[] = { CHAR_CONTROL_CODE, mFont_CONT_CODE_SET_COLOR_CHAR, 0, 0, 0, 0 }; int str_len = mMl_strlen(str, str_max, CHAR_SPACE); int src_len = mMl_strlen(src, src_max, CHAR_SPACE); @@ -1598,15 +1667,15 @@ static int mTG_init_tag_data_item_win_sub_mail_item_mail(mTG_tag_c* tag, mTG_str if (mail->header.recipient.type == mMl_NAME_TYPE_MUSEUM) { str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_VIOLET; - tag->str2_type = 4; + tag->str2_type = mTG_QSTR_TYPE_TO_MUSEUM; type = mTG_MAIL_TYPE_FROM_THE; } else if (mail->header.sender.type == mMl_NAME_TYPE_MUSEUM) { str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_GREEN; - tag->str2_type = 3; + tag->str2_type = mTG_QSTR_TYPE_FROM_MUSEUM; type = mTG_MAIL_TYPE_FROM2; } else { str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_VIOLET; - tag->str2_type = 2; + tag->str2_type = mTG_QSTR_TYPE_MAIL; } return type; @@ -1616,7 +1685,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_xmas(mTG_tag_c* tag, mTG_str mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_SANTA), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; - tag->str2_type = 5; + tag->str2_type = mTG_QSTR_TYPE_XMAS_SNOWMAN_SPNPC; return mTG_MAIL_TYPE_FROM; } @@ -1625,7 +1694,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_tanukiti(mTG_tag_c* tag, mTG mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_SHOP_MASTER), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; - tag->str2_type = 6; + tag->str2_type = mTG_QSTR_TYPE_SHOP; return mTG_MAIL_TYPE_FROM; } @@ -1634,7 +1703,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_tunekiti(mTG_tag_c* tag, mTG mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_BROKER), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; - tag->str2_type = 6; + tag->str2_type = mTG_QSTR_TYPE_SHOP; return mTG_MAIL_TYPE_FROM; } @@ -1643,7 +1712,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_mother(mTG_tag_c* tag, mTG_s mTG_strcpy(str_infos[1].str, mother_str, mTG_TAG_SEL_STRING_LEN, sizeof(mother_str)); str_infos[1].str_len = sizeof(mother_str); str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; - tag->str2_type = 7; + tag->str2_type = mTG_QSTR_TYPE_MOTHER; return mTG_MAIL_TYPE_FROM2; } @@ -1652,7 +1721,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_omikuji(mTG_tag_c* tag, mTG_ mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_EV_MIKO), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_INDIGO; - tag->str2_type = 9; + tag->str2_type = mTG_QSTR_TYPE_OMIKUJI; return mTG_MAIL_TYPE_FROM_S; } @@ -1661,7 +1730,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_happy(mTG_tag_c* tag, mTG_st mTG_strcpy(str_infos[1].str, str_happy_room, mTG_TAG_SEL_STRING_LEN, sizeof(str_happy_room)); str_infos[1].str_len = sizeof(str_happy_room); str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_GREEN; - tag->str2_type = 11; + tag->str2_type = mTG_QSTR_TYPE_HAPPY_ROOM; return mTG_MAIL_TYPE_FROM; } @@ -1670,7 +1739,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_snowman(mTG_tag_c* tag, mTG_ mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(ETC_SNOWMAN_BALL_A), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; - tag->str2_type = 5; + tag->str2_type = mTG_QSTR_TYPE_XMAS_SNOWMAN_SPNPC; return mTG_MAIL_TYPE_FROM; } @@ -1679,7 +1748,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_angler(mTG_tag_c* tag, mTG_s mTG_strcpy(str_infos[1].str, mNpc_GetNpcWorldNameP(SP_NPC_ANGLER), mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; - tag->str2_type = 8; + tag->str2_type = mTG_QSTR_TYPE_ANGLER; return mTG_MAIL_TYPE_FROM; } @@ -1689,7 +1758,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_postoffice(mTG_tag_c* tag, m mTG_strcpy(str_infos[1].str, postoffice_str, mTG_TAG_SEL_STRING_LEN, sizeof(postoffice_str)); str_infos[1].str_len = sizeof(postoffice_str); str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_GREEN; - tag->str2_type = 10; + tag->str2_type = mTG_QSTR_TYPE_POST_OFFICE; return mTG_MAIL_TYPE_FROM2; } @@ -1698,7 +1767,7 @@ static int mTG_init_tag_data_item_win_sub_mail_item_sp_npc(mTG_tag_c* tag, mTG_s mTG_strcpy(str_infos[1].str, mail->header.sender.personalID.player_name, mTG_TAG_SEL_STRING_LEN, PLAYER_NAME_LEN); str_infos[1].str_len = PLAYER_NAME_LEN; str_infos[1].color_idx = mTG_MAIL_NAME_COLOR_PURPLE; - tag->str2_type = 5; + tag->str2_type = mTG_QSTR_TYPE_XMAS_SNOWMAN_SPNPC; return mTG_MAIL_TYPE_FROM; } @@ -1708,7 +1777,7 @@ static rgba_t str_color[] = { { 205, 40, 40, 255 }, { 100, 65, 195, 255 }, { 60, 150, 65, 255 }, - { 54, 20, 255, 255 }, + { 165, 30, 255, 255 }, { 60, 50, 155, 255 }, { 225, 30, 220, 255 }, { 0, 0, 0, 255 }, @@ -1810,7 +1879,7 @@ static void mTG_init_tag_data_item_win_sub_mail_item(Submenu* submenu, mTG_tag_c mail_type = (*proc[mail->content.mail_type])(tag, str_infos, mail); } else if (tag->table == mTG_TABLE_ITEM) { - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; win_type = mTG_WIN_TYPE_SELECT; /* Show quest item info */ @@ -1832,14 +1901,14 @@ static void mTG_init_tag_data_item_win_sub_mail_item(Submenu* submenu, mTG_tag_c scale = 0.75f; mail_type = mTG_MAIL_TYPE_FROM3; - tag->str2_type = 1; + tag->str2_type = mTG_QSTR_TYPE_ITEM; } } } else { - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; } - if (tag->str2_type == 0) { + if (tag->str2_type == mTG_QSTR_TYPE_NONE) { if (itemCond == mPr_ITEM_COND_PRESENT) { mem_copy(tag->str0, present_str, sizeof(present_str)); } else if (itemNo >= ITM_MY_ORG_UMBRELLA0 && itemNo <= ITM_MY_ORG_UMBRELLA7) { @@ -1852,10 +1921,10 @@ static void mTG_init_tag_data_item_win_sub_mail_item(Submenu* submenu, mTG_tag_c win_type = mTG_WIN_TYPE_ITEM; } - if (tag->str2_type != 0) { - if (tag->str2_type == 1) { + if (tag->str2_type != mTG_QSTR_TYPE_NONE) { + if (tag->str2_type == mTG_QSTR_TYPE_ITEM) { mTG_strcpy(tag->str2, str_otodokemono, mTG_TAG_SEL_STRING_LEN, sizeof(str_otodokemono)); - } else if (tag->str2_type == 9) { + } else if (tag->str2_type == mTG_QSTR_TYPE_OMIKUJI) { mTG_strcpy(tag->str2, str_omikuji, mTG_TAG_SEL_STRING_LEN, sizeof(str_omikuji)); } else { mTG_strcpy(tag->str2, str_otegami, mTG_TAG_SEL_STRING_LEN, sizeof(str_otegami)); @@ -1976,12 +2045,12 @@ static void mTG_init_tag_data_cpmail_wc_win(Submenu* submenu, int folder_idx) { if (len <= 0 || cpmail_ovl->page_order[0] == tag->tag_row) { tag->arrow_dir = 0; - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; } else { f32 width = mFont_GetStringWidth(tag->str0, len, TRUE); mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_ITEM, width * 0.875f, 0.0f); - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; tag->body_ofs[0] *= -1.0f; tag->arrow_dir = 2; submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); @@ -1998,12 +2067,12 @@ static void mTG_init_tag_data_cporiginal_wc_win(Submenu* submenu) { if (len <= 0 || mCO_top_folder(submenu) == tag->tag_row) { tag->arrow_dir = 0; - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; } else { f32 width = mFont_GetStringWidth(tag->str0, len, TRUE); mTG_set_tag_win_scale_p(tag, mTG_WIN_TYPE_ITEM, width * 0.875f, 0.0f); - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; tag->body_ofs[0] *= -1.0f; tag->arrow_dir = 2; submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); @@ -2014,7 +2083,7 @@ static void mTG_init_tag_data_needlework_win(Submenu* submenu, int idx) { mTG_tag_c* tag = &submenu->overlay->tag_ovl->tags[0]; int len; - tag->str2_type = 0; + tag->str2_type = mTG_QSTR_TYPE_NONE; if (tag->table == mTG_TABLE_CPORIGINAL) { int hide = mCO_check_hide_flg(submenu, mCO_top_folder(submenu), idx); @@ -2215,19 +2284,19 @@ static void mTG_init_tag_data_select_win_after_item(mTG_tag_c* tag, mTG_tag_c* i left_flag = TRUE; } - if (item_tag->str2_type != 0) { - scale_x = 68.0f; - scale_y = 184.0f; + if (item_tag->str2_type != mTG_QSTR_TYPE_NONE) { + scale_x = 184.0f; + scale_y = 68.0f; data_p = &tag_add_item_data[1]; } else { - scale_x = 28.0f; - scale_y = 129.5f; + scale_x = 129.5f; + scale_y = 28.0f; data_p = &tag_add_item_data[0]; } tag->base_pos[1] += data_p->down_min[0][1] + (item_tag->body_ofs[1] - item_tag->body_scale[1] * scale_y * 0.5f) + item_tag->_04[1] * data_p->down_min[1][1]; - tag->body_ofs[1] = (data_p->up_min[0][1] + tag->_04[1] * data_p->up_min[1][1]) - tag->body_scale[1] * 129.0f * 0.5f; + tag->body_ofs[1] = (data_p->up_min[0][1] + tag->_04[1] * data_p->up_min[1][1]) - tag->body_scale[1] * 129.5f * 0.5f; tag->base_pos[0] += item_tag->body_ofs[0] - item_tag->body_scale[0] * scale_x * 0.5f; tag->body_ofs[0] = tag->body_scale[0] * 122.5f * 0.5f; @@ -2930,7 +2999,7 @@ static int mTG_make_money_sack(Submenu* submenu, mSM_MenuInfo_c* menu_info, mAct hand_ovl->info.catch_pg = 0; mTG_mark_main_CLR(submenu, menu_info); mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); - submenu->overlay->inventory_ovl->disp_money_change_frames = -(amount / 42); + submenu->overlay->inventory_ovl->disp_money_chg_step = -(amount / 42); sAdo_SysTrgStart(MONO(NA_SE_52)); res = TRUE; } @@ -3247,13 +3316,13 @@ static void mTG_get_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { } else { sAdo_SysTrgStart(MONO(NA_SE_52)); submenu->overlay->hand_ovl->info.wait_timer = 42; - inventory_ovl->disp_money_change_frames = change_money / 42; + inventory_ovl->disp_money_chg_step = change_money / 42; - if (ABS(inventory_ovl->disp_money_change_frames) % 5 == 0) { - if (inventory_ovl->disp_money_change_frames > 0) { - inventory_ovl->disp_money_change_frames--; + if (ABS(inventory_ovl->disp_money_chg_step) % 5 == 0) { + if (inventory_ovl->disp_money_chg_step > 0) { + inventory_ovl->disp_money_chg_step--; } else { - inventory_ovl->disp_money_change_frames++; + inventory_ovl->disp_money_chg_step++; } } } @@ -3803,7 +3872,7 @@ static void mTG_plant_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { pos.y = mCoBG_GetBgY_OnlyCenter_FromWpos2(pos, 0.0f); sAdo_OngenTrgStart(NA_SE_2A, &pos); mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); - mTG_close_window(submenu, menu_info, TRUE); + mTG_close_window(submenu, menu_info, FALSE); return; } } @@ -3857,7 +3926,7 @@ static void mTG_field_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { if (put_cnt != 0) { mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); - mTG_close_window(submenu, menu_info, TRUE); + mTG_close_window(submenu, menu_info, FALSE); } else if (bad_famicom_cnt != 0) { mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_FAMI); } else { @@ -4309,7 +4378,7 @@ static int mTG_mark_main_sub(Submenu* submenu, int menu_type, int param, int tab (mark_type != mTG_MARK_TYPE_INV_PLAYERROOM_ITEM || ((mark_type == mTG_MARK_TYPE_INV_PLAYERROOM_ITEM && type != NAME_TYPE_FTR0 && type != NAME_TYPE_FTR1) && - (!ITEM_IS_UMBRELLA(item) && !ITEM_IS_CLOTH(item)))) && + (!ITEM_IS_UMBRELLA2(item) && !ITEM_IS_CLOTH(item)))) && (mEv_CheckFirstJob() == FALSE || mark_type == mTG_MARK_TYPE_INV_PLAYERROOM_ITEM || type != NAME_TYPE_ITEM1 || category != ITEM1_CAT_PLANT))) { return TRUE; @@ -4493,7 +4562,7 @@ static int mTG_bit_chk_all0(u8* flags, u8* bits, int count) { return res; } -static int mTG_mark_mainX(Submenu* submenu, mSM_MenuInfo_c* menu_info, int table, int table_idx, int mode, +extern int mTG_mark_mainX(Submenu* submenu, mSM_MenuInfo_c* menu_info, int table, int table_idx, int mode, int* chk_result) { int mark_res; Mail_c* mail; @@ -4567,7 +4636,7 @@ static void mTG_mark_main_CLR(Submenu* submenu, mSM_MenuInfo_c* menu_info) { } } -static int mTG_mark_main(Submenu* submenu, mSM_MenuInfo_c* menu_info, int mode, int* chk_result) { +extern int mTG_mark_main(Submenu* submenu, mSM_MenuInfo_c* menu_info, int mode, int* chk_result) { mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; mTG_tag_c* tag = &tag_ovl->tags[0]; int idx = mTG_get_table_idx(tag); @@ -5090,7 +5159,7 @@ static void mTG_nw_room_put_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info, in } mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); - mTG_close_window(submenu, menu_info, TRUE); + mTG_close_window(submenu, menu_info, FALSE); mMkRm_ReportChangePlayerRoom(); } else if (res == aMR_JUDGE_MAX_FTR) { mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PUT_MAX_FURNITURE); @@ -5227,11 +5296,11 @@ static void mTG_change_original_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info } tag_ovl = submenu->overlay->tag_ovl; - tag_ovl->needlework_mark_flg = needlework_ovl->mark_flg; - tag_ovl->cporiginal_mark_flg = cporiginal_ovl->mark_flg; - tag_ovl->needlework_mark_max = mPr_ORIGINAL_DESIGN_COUNT; - tag_ovl->cporiginal_mark_max = mCO_ORIGINAL_NUM; - tag_ovl->change_original_mark_mode = mTG_CHANGE_ORIGINAL_MARK_DECIDE; + tag_ovl->original_mark.mark_flg[mTG_ORG_TYPE_NW] = needlework_ovl->mark_flg; + tag_ovl->original_mark.mark_flg[mTG_ORG_TYPE_CO] = cporiginal_ovl->mark_flg; + tag_ovl->original_mark.mark_max[mTG_ORG_TYPE_NW] = mPr_ORIGINAL_DESIGN_COUNT; + tag_ovl->original_mark.mark_max[mTG_ORG_TYPE_CO] = mCO_ORIGINAL_NUM; + tag_ovl->original_mark.mark_mode = mTG_CHANGE_ORIGINAL_MARK_DECIDE; sAdo_SysTrgStart(NA_SE_MENU_EXIT); @@ -5406,7 +5475,7 @@ static void mTG_cpack_change_mail_mark_move(Submenu* submenu, mIV_Ovl_c* inv_ovl y1 = cpmail_mark->_30[i][1]; tmp = tag_ovl->_370; - if (1.0f - tmp <= 0.01f) { + if (1.0f - tmp <= 0.00999999f) { pos_p->pos[0] = x1; pos_p->pos[1] = y1; cpmail_mark->_4A |= (1 << i); @@ -5932,7 +6001,7 @@ static int mTG_move_cursol_between_table_inventory_left(Submenu* submenu, mTG_ta } else { tag->table = mTG_TABLE_ITEM; tag->tag_col = 4; - tag->tag_row--; + tag->tag_row -= 2; if (tag->tag_row < 0) { tag->tag_row = 0; } @@ -6102,7 +6171,7 @@ static int mTG_move_cursol_between_table_inventory_upper(Submenu* submenu, mTG_t } } else if (tag->table == mTG_TABLE_MONEY) { if (mTG_move_check_hand_item(submenu, mTG_TABLE_PLAYER)) { - tag->table = mTG_TABLE_MONEY; + tag->table = mTG_TABLE_PLAYER; return TRUE; } } @@ -6673,4 +6742,2139 @@ static int mTG_select_tag_decide_item_normal(Submenu* submenu, mActor_name_t ite return ret_tag_type; } -// +static int mTG_select_tag_decide_item(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int idx = mTG_get_table_idx(tag); + mActor_name_t item = Now_Private->inventory.pockets[idx]; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int ret_tag_type = mTG_TYPE_NONE; + + if (item != EMPTY_NO) { + if (menu_info->menu_type == mSM_OVL_INVENTORY) { + switch (menu_info->data0) { + case mSM_IV_OPEN_NORMAL: + return mTG_select_tag_decide_item_normal(submenu, item, idx); + case mSM_IV_OPEN_SELL: + if (inv_ovl->item_mark_bitfield != 0 && (inv_ovl->item_mark_bitfield & (1 << idx)) != 0) { + ret_tag_type = mTG_TYPE_SELL_ALL_ITEM; + } else { + ret_tag_type = mTG_TYPE_SELL_ITEM; + } + break; + case mSM_IV_OPEN_GIVE: + ret_tag_type = mTG_TYPE_GIVE_ITEM; + break; + case mSM_IV_OPEN_TAKE: + ret_tag_type = mTG_TYPE_QUEST_ITEM; + break; + case mSM_IV_OPEN_SHRINE: + ret_tag_type = mTG_TYPE_SHRINE_ITEM; + break; + case mSM_IV_OPEN_PUTIN_FTR: + case mSM_IV_OPEN_MINIDISK: + ret_tag_type = mTG_TYPE_PUTIN_ITEM; + break; + case mSM_IV_OPEN_CURATOR: + ret_tag_type = mTG_TYPE_TAG_HAND_OVER_CURATOR; + break; + case mSM_IV_OPEN_PASSWORD: + ret_tag_type = mTG_TYPE_TAG_PASSWORD_ITEM; + break; + default: + break; + } + } else { + ret_tag_type = mTG_TYPE_CATCH_ITEM; + } + } + + return ret_tag_type; +} + +static int mTG_select_tag_decide_mail(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + static int mail_next_type[] = { + mTG_TYPE_DEF_SMAIL, + mTG_TYPE_DEF_SMAIL_PRE, + mTG_TYPE_DEF_RMAIL, + mTG_TYPE_DEF_RMAIL_PRE, + }; + Mail_c* mail = mTG_get_mail_pointer(submenu, NULL); + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int ret_tag_type = mTG_TYPE_NONE; + + if (tag->table == mTG_TABLE_MAIL && inv_ovl->mail_mark_bitfield2 != 0) { + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + + if ((inv_ovl->mail_mark_bitfield2 & (1 << idx)) != 0) { + switch (menu_info->menu_type) { + case mSM_OVL_MAILBOX: + ret_tag_type = mTG_TYPE_FIELD_MAIL_MARK; + break; + case mSM_OVL_CPMAIL: + ret_tag_type = mTG_TYPE_CPACK_MAIL_MARK; + break; + default: + ret_tag_type = mTG_TYPE_FIELD_MAIL_MARK; + break; + } + } + } + + if (menu_info->menu_type == mSM_OVL_MAILBOX && tag->table == mTG_TABLE_MBOX) { + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + + if (mailbox_ovl != NULL) { + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + + if ((mailbox_ovl->mark_bitfield & (1 << idx)) != 0) { + ret_tag_type = mTG_TYPE_FIELD_MAIL_MARK2; + } + } + } + + if (menu_info->menu_type == mSM_OVL_CPMAIL && tag->table == mTG_TABLE_CPMAIL) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + + if (cpmail_ovl != NULL) { + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + + if ((cpmail_ovl->mark_bitfield & (1 << idx)) != 0) { + ret_tag_type = mTG_TYPE_CPACK_MAIL_MARK; + } + } + } + + if (ret_tag_type != mTG_TYPE_NONE) { + return ret_tag_type; + } + + if (mMl_check_not_used_mail(mail) != TRUE) { + if (menu_info->menu_type == mSM_OVL_CPMAIL) { + if (mail->content.font == mMl_FONT_RECV_PLAYER_PRESENT || mail->content.font == mMl_FONT_RECV) { + return mTG_TYPE_ROOM_RMAIL; + } else { + return mTG_TYPE_DEF_RMAIL; + } + } + + if (menu_info->menu_type == mSM_OVL_MAILBOX) { + if (mail->content.font == mMl_FONT_RECV_PLAYER_PRESENT || mail->content.font == mMl_FONT_RECV || + mail->present != EMPTY_NO) { + return mTG_TYPE_ROOM_RMAIL; + } else { + return mTG_TYPE_DEF_RMAIL; + } + } + + /* mSM_OVL_INVENTORY */ + if (menu_info->data0 == mSM_IV_OPEN_SEND_MAIL) { + if (mMl_check_send_mail(mail)) { + return mTG_TYPE_SEND_MAIL; + } + } else { + int mail_flags = 0; + int ret; + + if (mail->present != EMPTY_NO) { + mail_flags |= mTG_MAIL_FLAG_PRESENT; + } + + if (!mMl_check_send_mail(mail)) { + mail_flags |= mTG_MAIL_FLAG_RECV; + } + + ret = mail_next_type[mail_flags]; + if (Common_Get(field_type) != mFI_FIELDTYPE2_FG || mail->content.font == mMl_FONT_RECV_PLAYER_PRESENT || + mail->content.font == mMl_FONT_RECV) { + if (ret == mTG_TYPE_DEF_SMAIL) { + ret = mTG_TYPE_ROOM_SMAIL; + } else if (ret == mTG_TYPE_DEF_RMAIL) { + ret = mTG_TYPE_ROOM_RMAIL; + } + } + + return ret; + } + } + + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_money(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int ret_tag_type = mTG_TYPE_MONEY_SACK; + u32 money = Now_Private->inventory.wallet; + mTG_tag_data_c* tag_data_p = &mTG_label_table[mTG_TYPE_MONEY_SACK]; + + if (money >= 30000) { + tag_data_p->words = mTG_money_sack4; + tag_data_p->lines = ARRAY_COUNT(mTG_money_sack4); + } else if (money >= 10000) { + tag_data_p->words = mTG_money_sack3; + tag_data_p->lines = ARRAY_COUNT(mTG_money_sack3); + } else if (money >= 1000) { + tag_data_p->words = mTG_money_sack2; + tag_data_p->lines = ARRAY_COUNT(mTG_money_sack2); + } else if (money >= 100) { + tag_data_p->words = mTG_money_sack1; + tag_data_p->lines = ARRAY_COUNT(mTG_money_sack1); + } else { + ret_tag_type = mTG_TYPE_NONE; + } + + return ret_tag_type; +} + +static int mTG_select_tag_decide_player(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mActor_name_t item = Now_Private->equipment; + int ret_tag_type = mTG_TYPE_NONE; + + if (item != EMPTY_NO) { + if (ITEM_IS_MYUMBRELLA_TOOL(item)) { + ret_tag_type = mTG_TYPE_TAG_REMOVE; + } else { + ret_tag_type = mTG_TYPE_CATCH_ITEM; + } + } + + return ret_tag_type; +} + +static int mTG_select_tag_decide_bg(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_haniwa(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mActor_name_t item = Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].item; + int ret_tag_type = mTG_TYPE_NONE; + + if (item != EMPTY_NO) { + if (menu_info->data0 == 0) { + ret_tag_type = mTG_TYPE_HANIWA_ITEM; + } else if (Save_Get(homes[menu_info->data1]).haniwa.items[tag->tag_col].exchange_type != mHm_HANIWA_TRADE_1) { + ret_tag_type = mTG_TYPE_HANIWA_GET_ITEM; + } + } + + return ret_tag_type; +} + +static int mTG_select_tag_decide_collect(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + submenu->overlay->tag_ovl->item_name_wait_time = 0; + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_wchange(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + if (inv_ovl->page_order[0] != tag->tag_row) { + mTG_mark_main_CLR(submenu, menu_info); + inv_ovl->next_page_id = tag->tag_row; + inv_ovl->page_move_timer = 40; + submenu->overlay->hand_ovl->nop_hand_func(submenu); + sAdo_SysTrgStart(NA_SE_41C); + } + + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_cpmail_wchange(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mCM_Ovl_c* cpmail_ovl = submenu->overlay->cpmail_ovl; + + if (cpmail_ovl->page_order[0] != tag->tag_row) { + cpmail_ovl->next_page_id = tag->tag_row; + cpmail_ovl->page_move_timer = 40; + submenu->overlay->hand_ovl->nop_hand_func(submenu); + sAdo_SysTrgStart(NA_SE_41C); + cpmail_ovl->mark_bitfield = 0; + } + + return mTG_TYPE_NONE; +} + +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, + &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); + + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_catalog(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mCL_Ovl_c* catalog_ovl = submenu->overlay->catalog_ovl; + mCL_Menu_c* catalog_menu = &catalog_ovl->menu_data[catalog_ovl->page_order[0]]; + int idx = catalog_menu->top_idx + tag->tag_row; + int ret_tag_type = mTG_TYPE_NONE; + + if (catalog_menu->item_list[idx] != EMPTY_NO) { + ret_tag_type = mTG_TYPE_ORDER_ITEM; + } + + return ret_tag_type; +} + +static int mTG_select_tag_decide_catalog_wchange(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mCL_Ovl_c* catalog_ovl = submenu->overlay->catalog_ovl; + + if (catalog_ovl->page_order[0] != tag->tag_row) { + mCL_Menu_c* catalog_menu; + + catalog_ovl->page_no = tag->tag_row; + catalog_ovl->page_timer = 40; + + catalog_menu = &catalog_ovl->menu_data[tag->tag_row]; + catalog_menu->top_idx = 0; + catalog_menu->y_idx = 0; + submenu->overlay->hand_ovl->nop_hand_func(submenu); + sAdo_SysTrgStart(NA_SE_41C); + submenu->overlay->tag_ovl->item_name_wait_time = mTG_get_item_name_wait_time(tag); + } + + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_music_main(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mMU_Ovl_c* music_ovl = submenu->overlay->music_ovl; + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + int ret_tag_type = mTG_TYPE_NONE; + + if (ChkRoomMusicBox(idx)) { + int i; + int n = 0; + + for (i = 0; i < MINIDISK_NUM; i++) { + if (ChkMusicBox(music_ovl->mark_flg, i)) { + n++; + } + } + + if (n >= 1 && ChkMusicBox(music_ovl->mark_flg, idx)) { + ret_tag_type = mTG_TYPE_MUSIC_SELECT_MANY; + } else { + ret_tag_type = mTG_TYPE_MUSIC_SELECT; + } + } + + return ret_tag_type; +} + +static int mTG_select_tag_decide_needlework(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); // @cleanup - unused + + switch (menu_info->data0) { + case 1: + if (Common_Get(field_type) == mFI_FIELDTYPE2_PLAYER_ROOM && Save_Get(scene_no) != SCENE_COTTAGE_MY) { + if (mSc_IS_SCENE_BASEMENT(Save_Get(scene_no))) { + return mTG_TYPE_TAG_NW_UG_ROOM; + } else { + return mTG_TYPE_TAG_NW_MY_ROOM; + } + } else { + return mTG_TYPE_TAG_NW_OT_ROOM; + } + break; + case 0: + default: + switch (menu_info->data3) { + case 0: + default: + return mTG_TYPE_TAG_NW_SELECT; + case 1: + return mTG_TYPE_TAG_NW_SELECT_CHANGE; + case 2: + return mTG_TYPE_TAG_NW_SELECT_PUT; + } + break; + } +} + +static int mTG_select_tag_decide_inv_wc_org(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + mTG_mark_main_CLR(submenu, menu_info); + inv_ovl->original_flag = FALSE; + inv_ovl->wc_flag = TRUE; + mSM_open_submenu_new(submenu, mSM_OVL_NEEDLEWORK, 1, 0, NULL); + menu_info->proc_status = mSM_OVL_PROC_WAIT; + menu_info->next_proc_status = mSM_OVL_PROC_WAIT; + submenu->overlay->hand_ovl->nop_hand_func(submenu); + sAdo_SysTrgStart(NA_SE_MENU_EXIT); + + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_cporiginal(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mCO_Ovl_c* cporiginal_ovl = submenu->overlay->cporiginal_ovl; + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + + if ((cporiginal_ovl->mark_flg & (1 << idx)) != 0) { + return mTG_TYPE_CHANGE_ORIGINAL; + } else { + return mTG_TYPE_CATCH_ITEM; + } +} + +static int mTG_select_tag_decide_cporiginal_nw(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mNW_Ovl_c* needlework_ovl = submenu->overlay->needlework_ovl; + int idx = mTG_get_table_idx(&submenu->overlay->tag_ovl->tags[0]); + + if ((needlework_ovl->mark_flg & (1 << idx)) != 0) { + return mTG_TYPE_CHANGE_ORIGINAL; + } else { + return mTG_TYPE_CATCH_ITEM; + } +} + +static int mTG_select_tag_decide_cporiginal_wc(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + if (tag->tag_row != mCO_top_folder(submenu)) { + mCO_change_up_folder(submenu, tag->tag_row); + submenu->overlay->hand_ovl->nop_hand_func(submenu); + sAdo_SysTrgStart(NA_SE_41C); + mCO_clear_mark_flg(submenu); + } + + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_cporiginal_ti(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + u8* folder_name; + + folder_name = mCO_get_folder_name(submenu, mCO_top_folder(submenu)); + mSM_open_submenu_new2(submenu, mSM_OVL_EDITOR, mED_TYPE_CP_TITLE, mCO_FOLDER_NAME_LEN, folder_name, + mCO_FOLDER_NAME_MAX_WIDTH); + menu_info->proc_status = mSM_OVL_PROC_WAIT; + return mTG_TYPE_NONE; +} + +static int mTG_select_tag_decide_gba_nw(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + int ret_tag_type = mTG_TYPE_NONE; + + if (!mTG_check_hand_condition(submenu)) { + if ((tag_ovl->nw_gba_flags & 0x4) != 0) { + tag->arrow_dir = 0; + tag_ovl->nw_gba_flags &= ~0x4; + ret_tag_type = mTG_TYPE_TAG_PUT_CHK; + } else { + tag_ovl->nw_gba_flags |= 0x1; + } + } else { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } + + return ret_tag_type; +} + +static void mTG_hand_drop_item(Submenu* submenu, mTG_tag_c* tag) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + int table; + int category; + + if (hand_ovl->info.act == mHD_ACTION_CLOSE_KEEP) { + hand_ovl->info.next_act = mHD_ACTION_OPEN; + mTG_init_tag_data_item_win(submenu); + if (hand_ovl->info.ret_flag == TRUE) { + table = hand_ovl->info.hold_tbl; + } else { + table = tag->table; + } + + if (table == mTG_TABLE_PLAYER) { + category = ITEM_NAME_GET_CAT(hand_ovl->info.item); + switch (category) { + case ITEM1_CAT_TOOL: + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_CATCH; + sAdo_SysTrgStart(NA_SE_5E); + break; + case ITEM1_CAT_CLOTH: + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_CHANGE; + sAdo_SysTrgStart(NA_SE_WEAR); + break; + case ITEM1_CAT_FRUIT: + case ITEM1_CAT_KABU: + mTG_island_check_fruit_eat(hand_ovl->info.item); + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_EAT; + break; + } + } else if (table == mTG_TABLE_NEEDLEWORK) { + mNW_clear_mark_flg(submenu); + } + } else if (hand_ovl->info.act == mHD_ACTION_SASU) { + hand_ovl->info.act = mHD_ACTION_OPEN; + hand_ovl->info.next_act = mHD_ACTION_OPEN; + } +} + +static void mTG_drop_item(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + Mail_c* mail; + u32 amount; + u32 money; + int idx; + + switch (tag->table) { + case mTG_TABLE_MAIL: + case mTG_TABLE_MBOX: + case mTG_TABLE_CPMAIL: + mail = mTG_get_mail_pointer(submenu, NULL); + if (mMl_check_not_used_mail(&hand_ovl->info.mail) != TRUE) { + mTG_hand_drop_item(submenu, tag); + } else if (mMl_check_not_used_mail(mail) != TRUE && hand_ovl->info.item != EMPTY_NO) { + if (mTG_check_item_on_mail(hand_ovl->info.item, hand_ovl->info.item_cond)) { + if (!mMl_check_set_present_myself(mail) && mail->present != EMPTY_NO && + mPr_GetPossessionItemIdx(Now_Private, EMPTY_NO) == -1) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PR_LEAVE); + mTG_init_tag_data_item_win(submenu); + } else if ((menu_info->menu_type == mSM_OVL_INVENTORY && + menu_info->data0 == mSM_IV_OPEN_EXCHANGE) && + ((hand_ovl->info.item == ITM_SIGNBOARD && mail->present != EMPTY_NO) || + mail->present == ITM_SIGNBOARD)) { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } else { + mTG_hand_drop_item(submenu, tag); + } + } else { + if (hand_ovl->info.item_cond == mPr_ITEM_COND_QUEST) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PR_QUEST); + } else if (hand_ovl->info.item_cond == mPr_ITEM_COND_PRESENT) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PRESENT_MAIL); + } else if (ITEM_IS_EXERCISE_CARD(hand_ovl->info.item)) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PR_CARD); + } else if (hand_ovl->info.item == ITM_KNIFE_AND_FORK) { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PR_FORK); + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_PR_FOOD); + } + + mTG_init_tag_data_item_win(submenu); + } + } + break; + case mTG_TABLE_MONEY: + amount = mTG_itemNo_to_amount(hand_ovl->info.item); + money = Now_Private->inventory.wallet; + + if (money + amount <= mPr_WALLET_MAX) { + hand_ovl->info.next_act = mHD_ACTION_OPEN; + } else { + mTG_open_warning_window(submenu, menu_info, mWR_WARNING_MONEY); + } + break; + case mTG_TABLE_GBA: + case mTG_TABLE_CARD: + idx = mTG_get_table_idx(tag); + if (idx != hand_ovl->info.hold_idx) { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } else { + mTG_hand_drop_item(submenu, tag); + } + break; + default: + mTG_hand_drop_item(submenu, tag); + break; + } +} + +static void mTG_drop_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_CLOSE); + mTG_drop_item(submenu, menu_info, tag); +} + +static void mTG_hand_return_item(Submenu* submenu, mTG_tag_c* tag) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + mActor_name_t item = hand_ovl->info.item; + mActor_name_t dst_item; + Mail_c* mail; + + switch (hand_ovl->info.hold_tbl) { + case mTG_TABLE_ITEM: + dst_item = Now_Private->inventory.pockets[(u8)hand_ovl->info.hold_idx]; + + if (dst_item == EMPTY_NO) { + hand_ovl->info.ret_flag = TRUE; + } else if (hand_ovl->info.item_cond == mPr_ITEM_COND_NORMAL && + mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, hand_ovl->info.hold_idx) == + mPr_ITEM_COND_NORMAL) { + if (ITEM_NAME_GET_TYPE(item) == NAME_TYPE_ITEM1 && ITEM_NAME_GET_CAT(item) == ITEM1_CAT_TICKET && + ITEM_NAME_GET_TYPE(dst_item) == NAME_TYPE_ITEM1 && + ITEM_NAME_GET_CAT(dst_item) == ITEM1_CAT_TICKET && TICKET_MONTH(item) == TICKET_MONTH(dst_item) && + (TICKET_COUNT(item) + TICKET_COUNT(dst_item)) <= TICKET_STACK_MAX) { + hand_ovl->info.ret_flag = TRUE; + } else if (ITEM_IS_WISP(item) && ITEM_IS_WISP(dst_item) && + (WISP_COUNT(dst_item) + WISP_COUNT(item)) <= WISP_STACK_MAX) { + hand_ovl->info.ret_flag = TRUE; + } else if (ITEM_IS_PAPER(item) && ITEM_IS_PAPER(dst_item) && + (PAPER2TYPE(item - ITM_PAPER_START) == PAPER2TYPE(dst_item - ITM_PAPER_START)) && + ((1 + PAPER2STACK(dst_item - ITM_PAPER_START)) + + (1 + PAPER2STACK(item - ITM_PAPER_START))) <= PAPER_STACK_MAX) { + hand_ovl->info.ret_flag = TRUE; + } + } + break; + case mTG_TABLE_NEEDLEWORK: + case mTG_TABLE_CPORIGINAL: + case mTG_TABLE_CPORIGINAL_NW: + case mTG_TABLE_GBA: + case mTG_TABLE_GBA_NW: + case mTG_TABLE_CARD: + case mTG_TABLE_CARD_NW: + hand_ovl->info.ret_flag = TRUE; + break; + case mTG_TABLE_MAIL: + case mTG_TABLE_MBOX: + case mTG_TABLE_CPMAIL: + mail = mTG_get_mail_pointer(submenu, hand_ovl); + if (mMl_check_not_used_mail(mail) != TRUE) { + if (item != EMPTY_NO && mTG_check_item_on_mail(item, hand_ovl->info.item_cond)) { + hand_ovl->info.ret_flag = TRUE; + } + } else { + if (mMl_check_not_used_mail(&hand_ovl->info.mail) != TRUE) { + hand_ovl->info.ret_flag = TRUE; + } + } + break; + case mTG_TABLE_MONEY: + if (ITEM_NAME_GET_TYPE(item) == NAME_TYPE_ITEM1 && ITEM_NAME_GET_CAT(item) == ITEM1_CAT_MONEY && + hand_ovl->info.item_cond == mPr_ITEM_COND_NORMAL && + Now_Private->inventory.wallet + mTG_itemNo_to_amount(item) <= mPr_WALLET_MAX) { + hand_ovl->info.ret_flag = TRUE; + } + break; + case mTG_TABLE_PLAYER: + if (ITEM_NAME_GET_TYPE(item) == NAME_TYPE_ITEM1 && ITEM_NAME_GET_CAT(item) == ITEM1_CAT_TOOL && + hand_ovl->info.item_cond == mPr_ITEM_COND_NORMAL) { + hand_ovl->info.ret_flag = TRUE; + } + break; + case mTG_TABLE_HANIWA: + hand_ovl->info.ret_flag = TRUE; + break; + } + + if (hand_ovl->info.ret_flag == FALSE && item != EMPTY_NO) { + int i; + + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + if (Now_Private->inventory.pockets[i] == EMPTY_NO) { + hand_ovl->info.hold_idx = i; + hand_ovl->info.hold_tbl = mTG_TABLE_ITEM; + hand_ovl->info.ret_flag = TRUE; + hand_ovl->info.catch_pg = 0; + break; + } + } + } + + if (hand_ovl->info.ret_flag == TRUE) { + mTG_hand_drop_item(submenu, tag); + } +} + +static int mTG_check_move_proc(Submenu* submenu, mTG_tag_c* tag) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int idx; + int res = TRUE; + + if (inv_ovl != NULL) { + switch (tag->table) { + case mTG_TABLE_ITEM: + idx = mTG_get_table_idx(tag); + if (mNT_check_unknown(Now_Private->inventory.pockets[idx]) == TRUE) { + res = FALSE; + } else if ((inv_ovl->selectable_item_bitfield & + (1 << (tag->tag_col + tag->tag_row * mIV_ITEM_COLUMNS))) == 0) { + res = FALSE; + } + break; + case mTG_TABLE_MAIL: + if ((inv_ovl->selectable_mail_bitfield & (1 << (tag->tag_col + tag->tag_row * mIV_MAIL_COLUMNS))) == + 0) { + res = FALSE; + } + break; + } + } + + return res; +} + +static void mTG_mark_proc(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + int chk_result; + int chk_rvs_result; + + if (mTG_check_hand_condition(submenu) && mTG_check_move_proc(submenu, tag) && + mTG_mark_main(submenu, menu_info, mTG_MARK_CHK, &chk_result)) { + if (mTG_mark_main(submenu, menu_info, mTG_MARK_RVS, &chk_rvs_result)) { + if (chk_result != chk_rvs_result) { + if (chk_result == FALSE) { + if (menu_info->menu_type == mSM_OVL_INVENTORY && menu_info->data0 == mSM_IV_OPEN_NORMAL) { + mTG_tag_c* main_tag = &tag_ovl->tags[0]; + + /* Deselect the opposite inventory table's selected items */ + if (main_tag->table == mTG_TABLE_ITEM) { + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_MAIL, 0, mTG_MARK_CLR, NULL); + } else if (main_tag->table == mTG_TABLE_MAIL) { + mTG_mark_mainX(submenu, menu_info, mTG_TABLE_ITEM, 0, mTG_MARK_CLR, NULL); + } + } + + sAdo_SysTrgStart(NA_SE_45E); + } else { + sAdo_SysTrgStart(NA_SE_45F); + } + } + } else { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } + } else { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } +} + +static void mTG_move_cancel(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int move_dir; + int sfx; + + if (menu_info->menu_type == mSM_OVL_INVENTORY && menu_info->data0 == mSM_IV_OPEN_EXCHANGE) { + mTG_exchange_proc(submenu, menu_info); + return; + } + + if (mTG_check_hand_condition(submenu)) { + switch (menu_info->menu_type) { + case mSM_OVL_CPMAIL: + case mSM_OVL_CPORIGINAL: + case mSM_OVL_GBA: + menu_info->proc_status = mSM_OVL_PROC_WAIT; + mSM_open_submenu(submenu, mSM_OVL_EDITENDCHK, mEE_TYPE_CPACK, 0); + sAdo_SysTrgStart(NA_SE_5F); + return; + } + + sfx = NA_SE_31; + switch (menu_info->menu_type) { + case mSM_OVL_INVENTORY: + case mSM_OVL_CATALOG: + move_dir = mSM_MOVE_OUT_RIGHT; + break; + case mSM_OVL_NEEDLEWORK: + move_dir = mSM_MOVE_OUT_RIGHT; + if (menu_info->data0 == 2) { + move_dir = -1; + } + break; + case mSM_OVL_MAILBOX: + move_dir = mSM_MOVE_OUT_LEFT; + sfx = SE_FLAG_15(NA_SE_ZOOMDOWN_SHORT); + break; + default: + move_dir = mSM_MOVE_OUT_LEFT; + break; + } + + if (move_dir != -1) { + submenu->overlay->move_chg_base_proc(menu_info, move_dir); + } + + if (sfx >= 0) { + sAdo_SysTrgStart(sfx); + } + } else { + mTG_hand_return_item(submenu, tag); + } +} + +typedef int (*mTG_DECIDE_PROC)(Submenu*, mSM_MenuInfo_c*, mTG_tag_c*); + +static void mTG_move_decide(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + static mTG_DECIDE_PROC decide_proc[] = { + &mTG_select_tag_decide_item, + &mTG_select_tag_decide_mail, + &mTG_select_tag_decide_money, + &mTG_select_tag_decide_player, + &mTG_select_tag_decide_bg, + &mTG_select_tag_decide_mail, + &mTG_select_tag_decide_haniwa, + &mTG_select_tag_decide_collect, + &mTG_select_tag_decide_wchange, + &mTG_select_tag_decide_mail, + &mTG_select_tag_decide_cpmail_wchange, + &mTG_select_tag_decide_cpmail_title, + (mTG_DECIDE_PROC)NULL, + (mTG_DECIDE_PROC)NULL, + &mTG_select_tag_decide_catalog, + &mTG_select_tag_decide_catalog_wchange, + &mTG_select_tag_decide_music_main, + &mTG_select_tag_decide_needlework, + &mTG_select_tag_decide_cporiginal, + &mTG_select_tag_decide_inv_wc_org, + &mTG_select_tag_decide_cporiginal_nw, + &mTG_select_tag_decide_cporiginal_wc, + &mTG_select_tag_decide_cporiginal_ti, + &mTG_select_tag_decide_cporiginal_nw, + &mTG_select_tag_decide_gba_nw, + &mTG_select_tag_decide_cporiginal_nw, + &mTG_select_tag_decide_gba_nw, + }; + + if (!mTG_check_move_proc(submenu, tag)) { + sAdo_SysTrgStart(MONO(NA_SE_A)); + return; + } + + if (mTG_check_hand_condition(submenu) == TRUE || tag->table == mTG_TABLE_CPMAIL_WC || + tag->table == mTG_TABLE_CPORIGINAL_WC || tag->table == mTG_TABLE_CARD_NW || tag->table == mTG_TABLE_GBA_NW) { + int tag_type = (*decide_proc[tag->table])(submenu, menu_info, tag); + + if (menu_info->menu_type == mSM_OVL_INVENTORY && tag_type != mTG_TYPE_NONE) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + switch (tag->table) { + case mTG_TABLE_ITEM: + if ((inv_ovl->item_mark_bitfield & (1 << mTG_get_table_idx(tag))) == 0) { + inv_ovl->item_mark_bitfield = 0; + } + inv_ovl->mail_mark_bitfield2 = 0; + break; + case mTG_TABLE_MAIL: + if ((inv_ovl->mail_mark_bitfield2 & (1 << mTG_get_table_idx(tag))) == 0) { + inv_ovl->mail_mark_bitfield2 = 0; + } + inv_ovl->item_mark_bitfield = 0; + break; + default: + inv_ovl->item_mark_bitfield = 0; + inv_ovl->mail_mark_bitfield2 = 0; + break; + } + } + + if (tag_type != mTG_TYPE_NONE) { + submenu->overlay->tag_ovl->item_name_wait_time = 0; + mTG_chg_tag_func(submenu, tag->table, tag_type, 0, tag->base_pos[0], tag->base_pos[1]); + sAdo_SysTrgStart(NA_SE_32); + } + } else { + mTG_drop_item(submenu, menu_info, tag); + } +} + +static void mTG_move_catch(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + if ( + // clang-format off + (menu_info->menu_type == mSM_OVL_INVENTORY && (menu_info->data0 == mSM_IV_OPEN_NORMAL || menu_info->data0 == mSM_IV_OPEN_EXCHANGE)) || + (menu_info->menu_type == mSM_OVL_HANIWA && (menu_info->data0 == 0)) || + (menu_info->menu_type == mSM_OVL_CPMAIL && (tag->table != mTG_TABLE_CPMAIL_WC)) || + (menu_info->menu_type == mSM_OVL_MAILBOX) || + (menu_info->menu_type == mSM_OVL_NEEDLEWORK && (menu_info->data0 != 0)) || + (menu_info->menu_type == mSM_OVL_CPORIGINAL && (tag->table == mTG_TABLE_CPORIGINAL_NW || tag->table == mTG_TABLE_CPORIGINAL)) || + (menu_info->menu_type == mSM_OVL_GBA && (tag->table == mTG_TABLE_GBA || tag->table == mTG_TABLE_CARD)) + // clang-format on + ) { + if (mTG_check_move_proc(submenu, tag)) { + if (mTG_check_hand_condition(submenu) == TRUE) { + mTG_catch_proc(submenu, menu_info); + } else { + mTG_drop_item(submenu, menu_info, tag); + } + } else { + sAdo_SysTrgStart(MONO(NA_SE_A)); + } + } +} + +static void mTG_move_change(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int row; + + if (menu_info->menu_type == mSM_OVL_INVENTORY && menu_info->data0 == mSM_IV_OPEN_NORMAL && + mTG_check_hand_condition(submenu) == TRUE) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + int idx_y; + + if (inv_ovl->page_order[0] == mIV_PAGE_INVENTORY) { + idx_y = 0; + } else if (inv_ovl->page_order[0] == mIV_PAGE_FISH_COLLECTION) { + idx_y = 2; + } else { + idx_y = 1; + } + + mTG_init_tag_data(submenu, mTG_TABLE_WCHANGE, mTG_TYPE_NONE, 0.0f, 0.0f, 0, idx_y); + mTG_select_tag_decide_wchange(submenu, menu_info, tag); + } else if (menu_info->menu_type == mSM_OVL_CATALOG && mTG_check_hand_condition(submenu) == TRUE) { + tag->tag_row = (submenu->overlay->catalog_ovl->page_order[0] + 1) % mCL_MENU_NUM; + mTG_select_tag_decide_catalog_wchange(submenu, menu_info, 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; + mTG_select_tag_decide_cpmail_wchange(submenu, menu_info, tag); + tag->tag_row = row; + } else if (menu_info->menu_type == mSM_OVL_CPORIGINAL) { + row = tag->tag_row; + tag->tag_row = (mCO_top_folder(submenu) + 1) % mCO_PAGE_NUM; + mTG_select_tag_decide_cporiginal_wc(submenu, menu_info, tag); + tag->tag_row = row; + } +} + +static void mTG_move_move(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + + if (hand_ovl->info.act == mHD_ACTION_CLOSE_KEEP || hand_ovl->info.act == mHD_ACTION_SASU) { + if (mTG_move_cursol_base(submenu, tag, menu_info)) { + mTG_init_tag_data_item_win(submenu); + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } +} + +static void mTG_move_base(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + u32 trigger = submenu->overlay->menu_control.trigger; + + if (trigger & (BUTTON_B | BUTTON_START | BUTTON_Y)) { + mTG_move_cancel(submenu, menu_info, tag); + } else if (trigger & BUTTON_A) { + mTG_move_decide(submenu, menu_info, tag); + } else if (trigger & BUTTON_L) { + mTG_move_catch(submenu, menu_info, tag); + } else if (trigger & BUTTON_R) { + mTG_move_change(submenu, menu_info, tag); + } else if (trigger & BUTTON_X) { + mTG_mark_proc(submenu, menu_info, tag); + } else { + mTG_move_move(submenu, menu_info, tag); + } +} + +static void mTG_move_base_mailbox(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mMB_Ovl_c* mailbox_ovl = submenu->overlay->mailbox_ovl; + + if (mailbox_ovl->mark_flag == 2) { + mTG_check_trans_mail_mark(submenu, menu_info, tag); + mailbox_ovl->display_flag = TRUE; + } else if (mailbox_ovl->open_flag == TRUE && mTG_check_trans_mail(submenu, menu_info, tag)) { + mailbox_ovl->display_flag = TRUE; + } else { + mTG_move_base(submenu, menu_info, tag); + mailbox_ovl->display_flag = FALSE; + } +} + +static void mTG_move_cpmail(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mCM_Ovl_c* cmpmail_ovl = submenu->overlay->cpmail_ovl; + + if (cmpmail_ovl->mark_flag == 2) { + mTG_cpack_change_mail_mark(submenu, menu_info, tag); + } else { + mTG_move_base(submenu, menu_info, tag); + } +} + +static void mTG_change_original_mark_move(Submenu* submenu, mNW_Ovl_c* nw_ovl, mCO_Ovl_c* co_ovl, int mark_idx) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_cporiginal_mark_c* mark_p = &tag_ovl->original_mark.mark[mark_idx]; + int i; + + add_calc(&tag_ovl->original_mark.move_percent, 1.0f, 1.0f - sqrtf(0.5f), 0.175f, 0.005f); + if (tag_ovl->original_mark.move_percent >= 0.99f) { + for (i = 0; i < 2; i++) { + mTG_cporiginal_mark_entry_c* entry_p = &tag_ovl->original_entries[i]; + + entry_p->pos[0] = mark_p->_10[i][0]; + entry_p->pos[1] = mark_p->_10[i][1]; + entry_p->item = EMPTY_NO; + } + + mCO_swap_image(submenu, RSV_NW_ORIGINAL0 + mark_p->idx[mTG_ORG_TYPE_NW], + RSV_CPORIGINAL_FLD0_00 + mCO_top_folder(submenu) * mCO_ORIGINAL_NUM + + mark_p->idx[mTG_ORG_TYPE_CO]); + mCO_clear_hide_flg(submenu); + mNW_clear_hide_flg(submenu); + tag_ovl->original_mark.mark_flg[mTG_ORG_TYPE_NW] &= ~(1 << mark_p->idx[mTG_ORG_TYPE_NW]); + tag_ovl->original_mark.mark_flg[mTG_ORG_TYPE_CO] &= ~(1 << mark_p->idx[mTG_ORG_TYPE_CO]); + sAdo_SysTrgStart(NA_SE_446); + tag_ovl->original_mark.mark_mode = mTG_CHANGE_ORIGINAL_MARK_DECIDE; + } else { + for (i = 0; i < 2; i++) { + mTG_cporiginal_mark_entry_c* entry_p = &tag_ovl->original_entries[i]; + f32 x0 = mark_p->_00[i][0]; + f32 x1 = mark_p->_10[i][0]; + f32 y0 = mark_p->_00[i][1]; + f32 y1 = mark_p->_10[i][1]; + + entry_p->pos[0] = x0 + (x1 - x0) * tag_ovl->original_mark.move_percent; + entry_p->pos[1] = y0 + (y1 - y0) * tag_ovl->original_mark.move_percent; + } + } + + mTG_init_tag_data_item_win(submenu); +} + +static void mTG_change_original_mark_decide(Submenu* submenu, mNW_Ovl_c* nw_ovl, mCO_Ovl_c* co_ovl, int mark_idx) { + static int table_no[] = { mTG_TABLE_CPORIGINAL_NW, mTG_TABLE_CPORIGINAL }; + int k; + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_mark_original_c* original_mark_p = &tag_ovl->original_mark; + s16 idx1[mTG_ORG_TYPE_NUM]; + s16 idx0[mTG_ORG_TYPE_NUM]; + s16 mark_max; + int i; + int j; + int cp_org_top = co_ovl->page_order[0]; + mTG_cporiginal_mark_entry_c* entry_p; + mTG_cporiginal_mark_c* mark_p = &tag_ovl->original_mark.mark[mark_idx]; + + for (i = 0; i < mTG_ORG_TYPE_NUM; i++) { + mark_max = original_mark_p->mark_max[i]; + idx1[i] = -1; + for (j = 0; j < mark_max; j++) { + if ((original_mark_p->mark_flg[i] & (1 << j)) != 0) { + mark_p->idx[i] = j; + idx1[i] = j; + idx0[1 - i] = j; + break; + } + } + } + + if (idx1[mTG_ORG_TYPE_NW] < 0 && idx1[mTG_ORG_TYPE_CO] < 0) { + original_mark_p->mark_mode = mTG_CHANGE_ORIGINAL_MARK_NONE; + } else { + original_mark_p->move_percent = 0.0f; + original_mark_p->mark_mode = mTG_CHANGE_ORIGINAL_MARK_MOVE; + for (k = 0; k < mTG_ORG_TYPE_NUM; k++) { + entry_p = &tag_ovl->original_entries[k]; + + mTG_set_hand_pos(submenu, mark_p->_00[k], table_no[k], idx1[k]); + mTG_set_hand_pos(submenu, mark_p->_10[k], table_no[1 - k], idx0[k]); + + switch (k) { + case mTG_ORG_TYPE_NW: + entry_p->item = RSV_NW_ORIGINAL0 + idx1[k]; + mNW_on_hide_flg(submenu, idx1[k]); + mNW_clear_mark_flg(submenu); + break; + case mTG_ORG_TYPE_CO: + entry_p->item = RSV_CPORIGINAL_FLD0_00 + mCO_top_folder(submenu) * mCO_ORIGINAL_NUM + idx1[k]; + mCO_on_hide_flg(submenu, cp_org_top, idx1[k]); + mCO_clear_mark_flg(submenu); + break; + } + + mTG_change_original_mark_move(submenu, nw_ovl, co_ovl, mark_idx); + } + + mTG_init_tag_data_item_win(submenu); + } +} + +static int mTG_change_cporiginal_mark_main(Submenu* submenu, mNW_Ovl_c* nw_ovl, mCO_Ovl_c* co_ovl) { + switch (submenu->overlay->tag_ovl->original_mark.mark_mode) { + case mTG_CHANGE_ORIGINAL_MARK_DECIDE: + mTG_change_original_mark_decide(submenu, nw_ovl, co_ovl, 0); + break; + case mTG_CHANGE_ORIGINAL_MARK_MOVE: + mTG_change_original_mark_move(submenu, nw_ovl, co_ovl, 0); + break; + } + + return TRUE; +} + +static void mTG_change_cporiginal_mark(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + mTG_change_cporiginal_mark_main(submenu, submenu->overlay->needlework_ovl, submenu->overlay->cporiginal_ovl); +} + +static void mTG_move_base_cporiginal(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + if (submenu->overlay->tag_ovl->original_mark.mark_mode != mTG_CHANGE_ORIGINAL_MARK_NONE) { + mTG_change_cporiginal_mark(submenu, menu_info, tag); + } else { + mTG_move_base(submenu, menu_info, tag); + } +} + +static void mTG_move_delete(Submenu* submenu, mTG_tag_c* tag) { + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + inv_ovl->remove_timer--; + if (inv_ovl->remove_timer == 0) { + int idx = mTG_get_table_idx(tag); + + if (tag->table == mTG_TABLE_ITEM) { + u32 cond = mPr_GET_ITEM_COND(Now_Private->inventory.item_conditions, idx); + + if ((cond & mPr_ITEM_COND_PRESENT) != 0) { + Now_Private->inventory.item_conditions = + mPr_SET_ITEM_COND(Now_Private->inventory.item_conditions, (u32)idx, mPr_ITEM_COND_NORMAL); + inv_ovl->item_scale_type[idx] = mIV_ITEM_SCALE_TYPE_NONE; + } else { + mActor_name_t item = Now_Private->inventory.pockets[idx]; + + if (ITEM_IS_EXERCISE_CARD(item) || item == ITM_KNIFE_AND_FORK) { + mPr_SetPossessionItem(Now_Private, (u32)idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + inv_ovl->item_scale_type[idx] = mIV_ITEM_SCALE_TYPE_NONE; + } else { + u8* scale_p = inv_ovl->item_scale_type; + int i; + + mPr_SetPossessionItem(Now_Private, (u32)idx, EMPTY_NO, mPr_ITEM_COND_NORMAL); + for (i = 0; i < mPr_POCKETS_SLOT_COUNT; i++) { + *scale_p++ = mIV_ITEM_SCALE_TYPE_NONE; + } + } + } + + mTG_init_tag_data_item_win(submenu); + } else { + mMB_Ovl_c* mailbox_ovl; + mCM_Ovl_c* cpmail_ovl; + + mailbox_ovl = submenu->overlay->mailbox_ovl; + cpmail_ovl = submenu->overlay->cpmail_ovl; + + if (inv_ovl->mail_mark_flag == 0 && + ((mailbox_ovl != NULL && mailbox_ovl->mark_flag == 0) || mailbox_ovl == NULL) && + ((cpmail_ovl != NULL && cpmail_ovl->mark_flag == 0) || cpmail_ovl == NULL)) { + mMl_clear_mail(mTG_get_mail_pointer(submenu, NULL)); + } else { + if (inv_ovl->mail_mark_flag == 1) { + int i; + + for (i = 0; i < mPr_INVENTORY_MAIL_COUNT; i++) { + if (mMl_check_not_used_mail(&Now_Private->mail[i]) != TRUE && + (inv_ovl->mail_mark_bitfield2 & (1 << i)) != 0) { + mMl_clear_mail(&Now_Private->mail[i]); + inv_ovl->mail_mark_bitfield2 &= ~(1 << i); + } + } + + inv_ovl->mail_mark_flag = 0; + inv_ovl->mail_mark_bitfield2 = 0; + } + + if (mailbox_ovl != NULL) { + if (mailbox_ovl->mark_flag == 1) { + int i; + + for (i = 0; i < mMB_MAIL_COUNT; i++) { + if ((mailbox_ovl->mark_bitfield & (1 << i)) != 0) { + mMl_clear_mail(&Common_Get(now_home)->mailbox[i]); + } + } + + mailbox_ovl->mark_flag = 0; + mailbox_ovl->mark_bitfield = 0; + } + } + + if (cpmail_ovl != NULL) { + if (cpmail_ovl->mark_flag == 1) { + int i; + int page = cpmail_ovl->page_order[0]; + + for (i = 0; i < mCM_MAIL_COUNT; i++) { + if ((cpmail_ovl->mark_bitfield & (1 << i)) != 0) { + mMl_clear_mail(&cpmail_ovl->card_mail->mail[page][i]); + } + } + + cpmail_ovl->mark_bitfield = 0; + cpmail_ovl->mark_flag = 0; + } + } + } + } + + mTG_init_tag_data_item_win(submenu); + } +} + +static void mTG_select_tag_base(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + u32 trigger = submenu->overlay->menu_control.trigger; + + if (trigger & (BUTTON_B | BUTTON_START | BUTTON_Y)) { + if (menu_info->menu_type == mSM_OVL_INVENTORY && menu_info->data0 == mSM_IV_OPEN_QUEST) { + mTG_close_window(submenu, menu_info, TRUE); + } else { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* last_tag = &tag_ovl->tags[tag_ovl->sel_tag_idx - 1]; + + mTG_return_tag_init(submenu, last_tag->type, mTG_RETURN_KEEP); + sAdo_SysTrgStart(MONO(NA_SE_3)); + } + } else if (trigger & (BUTTON_A)) { + mTG_label_table[tag->type].words[tag->tag_row]->move_proc(submenu, menu_info); + } else { + int max = mTG_label_table[tag->type].lines - 1; + + if (trigger & (BUTTON_CDOWN | BUTTON_CUP)) { + if (trigger & (BUTTON_CDOWN)) { + if (tag->tag_row < max) { + tag->tag_row++; + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } else { + if (tag->tag_row > 0) { + tag->tag_row--; + sAdo_SysTrgStart(NA_SE_CURSOL); + } + } + } + } +} + +static int mTG_normal_move(Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_Ovl_c* tag_ovl, mTG_tag_c* tag, + mIV_Ovl_c* inv_ovl) { + if (menu_info->menu_type == mSM_OVL_INVENTORY && menu_info->data0 == mSM_IV_OPEN_EXCHANGE && + mTG_check_hand_condition(submenu)) { + mTG_exchange_proc(submenu, menu_info); + return TRUE; + } + + if (tag_ovl->sel_tag_idx > tag_ovl->ret_tag_idx) { + mTG_return_tag_func(submenu, tag_ovl, tag); + } else if (menu_info->menu_type != submenu->current_menu_type) { + return TRUE; + } else if (tag->type == mTG_TYPE_NONE) { + if (inv_ovl != NULL && inv_ovl->remove_timer > 0) { + mTG_move_delete(submenu, tag); + } else { + if (tag_ovl->item_name_wait_time > 0) { + tag_ovl->item_name_wait_time--; + } else { + tag->scale += 0.125f; + if (tag->scale > 1.0f) { + tag->scale = 1.0f; + } + } + + if (menu_info->menu_type == mSM_OVL_MAILBOX) { + mTG_move_base_mailbox(submenu, menu_info, tag); + } else if (menu_info->menu_type == mSM_OVL_CPMAIL) { + mTG_move_cpmail(submenu, menu_info, tag); + } else if (menu_info->menu_type == mSM_OVL_CPORIGINAL) { + mTG_move_base_cporiginal(submenu, menu_info, tag); + } else { + mTG_move_base(submenu, menu_info, tag); + } + } + } else if (tag->scale >= 1.0f) { + if (tag->type == mTG_TYPE_HANIWA_PRICE) { + mTG_mv_priceSet(submenu, menu_info, tag); + } else { + mTG_select_tag_base(submenu, menu_info, tag); + } + } else { + mTG_tag_c* main_tag = &tag_ovl->tags[0]; + + if (tag_ovl->sel_tag_idx == 1 && main_tag->arrow_dir != 0 && main_tag->scale < 1.0f) { + main_tag->scale += 0.125f; + if (main_tag->scale > 1.0f) { + main_tag->scale = 1.0f; + } + + submenu->overlay->menu_control.hand_move_func(submenu); + return TRUE; + } + + if (tag_ovl->sel_tag_idx == 1 && main_tag->arrow_dir != 0) { + tag->scale += 0.185f; + } else { + tag->scale += 0.125f; + } + + if (tag->scale > 1.0f) { + tag->scale = 1.0f; + } + } + + return FALSE; +} + +static void mTG_move_func(Submenu* submenu, mSM_MenuInfo_c* menu_info) { + mTG_Ovl_c* tag_ovl = submenu->overlay->tag_ovl; + mTG_tag_c* tag = &tag_ovl->tags[tag_ovl->sel_tag_idx]; + mHD_Ovl_c* hand_ovl = submenu->overlay->hand_ovl; + mIV_Ovl_c* inv_ovl = submenu->overlay->inventory_ovl; + + if (tag_ovl->sel_tag_idx < 0 || tag_ovl->sel_tag_idx >= mTG_TAG_NUM) { + return; + } + + if (hand_ovl->info.wait_timer > 0 && inv_ovl != NULL) { + hand_ovl->info.wait_timer--; + if (tag_ovl->sel_tag_idx > tag_ovl->ret_tag_idx) { + mTG_return_tag_func(submenu, tag_ovl, tag); + } + + if (hand_ovl->info.wait_timer == 0) { + if (tag->table == mTG_TABLE_PLAYER) { + if (!ITEM_IS_MYUMBRELLA_TOOL(Now_Private->equipment)) { + hand_ovl->info.next_act = mHD_ACTION_CLOSE; + hand_ovl->info.item = Now_Private->equipment; + hand_ovl->info.item_cond = mPr_ITEM_COND_NORMAL; + hand_ovl->info.hold_tbl = mTG_TABLE_PLAYER; + hand_ovl->info.hold_idx = 0; + } + + Now_Private->equipment = EMPTY_NO; + mTG_init_tag_data_item_win(submenu); + submenu->overlay->segment.change_player_main_anime_idx = mIV_ANIM_WALK; + } else { + inv_ovl->disp_money = Now_Private->inventory.wallet; + inv_ovl->disp_money_chg_step = 0; + + if (menu_info->menu_type == mSM_OVL_HANIWA) { + sAdo_SysTrgStart(MONO(NA_SE_REGISTER)); + } + + if (menu_info->menu_type == mSM_OVL_INVENTORY && menu_info->data0 == mSM_IV_OPEN_EXCHANGE && + mTG_check_hand_condition(submenu)) { + mTG_exchange_proc(submenu, menu_info); + return; + } + + mTG_init_tag_data_item_win(submenu); + } + } else if (inv_ovl->disp_money != Now_Private->inventory.wallet) { + inv_ovl->disp_money += inv_ovl->disp_money_chg_step; + } + } else if (hand_ovl->info.move_flag == FALSE && hand_ovl->info.act != mHD_ACTION_CLOSE && + hand_ovl->info.act != mHD_ACTION_CLOSE2 && hand_ovl->info.act != mHD_ACTION_OPEN) { + if (tag_ovl->nw_gba_flags & 0x1) { + mTG_return_tag_init(submenu, mTG_TYPE_NONE, mTG_RETURN_KEEP); + tag_ovl->nw_gba_flags &= ~0x1; + tag_ovl->nw_gba_flags |= 0x2; + } else if (tag_ovl->nw_gba_flags & 0x2) { + if (tag_ovl->sel_tag_idx > tag_ovl->ret_tag_idx) { + mTG_return_tag_func(submenu, tag_ovl, tag); + } else { + tag_ovl->nw_gba_flags &= ~0x2; + tag_ovl->nw_gba_flags |= 0x4; + mTG_move_decide(submenu, menu_info, tag); + } + } else if (submenu->overlay->segment.player_anime_timer <= 0) { + if (mTG_normal_move(submenu, menu_info, tag_ovl, tag, inv_ovl)) { + return; + } + } else if (tag->table == mTG_TABLE_NEEDLEWORK && tag_ovl->sel_tag_idx > tag_ovl->ret_tag_idx) { + mTG_return_tag_func(submenu, tag_ovl, tag); + } + } else if (tag_ovl->sel_tag_idx > tag_ovl->ret_tag_idx) { + mTG_return_tag_func(submenu, tag_ovl, tag); + } + + submenu->overlay->menu_control.hand_move_func(submenu); + if ((submenu->menu_type == mSM_OVL_NEEDLEWORK || submenu->menu_type == mSM_OVL_CPORIGINAL || + submenu->menu_type == mSM_OVL_GBA) && + hand_ovl->info.item != EMPTY_NO) { + if (submenu->menu_type == mSM_OVL_GBA && (tag->table == mTG_TABLE_GBA_NW || tag->table == mTG_TABLE_CARD_NW) && + tag_ovl->sel_tag_idx == 1 && tag_ovl->tags[tag_ovl->sel_tag_idx].type == mTG_TYPE_TAG_PUT_CHK) { + tag_ovl->nw_gba_flags &= ~0x8; + } else { + tag_ovl->nw_gba_flags |= 0x8; + } + } else { + tag_ovl->nw_gba_flags &= ~0x8; + } +} + +enum { + mTG_TAG_COLOR_NORMAL, + mTG_TAG_COLOR_CPEDIT, + mTG_TAG_COLOR_CATALOG, + mTG_TAG_COLOR_MUSIC, + + mTG_TAG_COLOR_NUM +}; + +// clang-format off +static rgba_t mTG_select_col_type_on[] = { + { 120, 35, 255, 255 }, + { 70, 70, 100, 255 }, + { 135, 20, 225, 255 }, + { 255, 215, 50, 255 }, +}; +// clang-format on + +// clang-format off +static rgba_t mTG_select_col_type_off[] = { + { 140, 150, 190, 255 }, + { 130, 130, 150, 255 }, + { 145, 135, 195, 255 }, + { 115, 110, 70, 255 }, +}; +// clang-format on + +static int mTG_get_special_color(mSM_MenuInfo_c* menu_info, mTG_tag_c* tag) { + int color = mTG_TAG_COLOR_NORMAL; + + if (menu_info->menu_type == mSM_OVL_CATALOG) { + color = mTG_TAG_COLOR_CATALOG; + } else if (menu_info->menu_type == mSM_OVL_MUSIC) { + color = mTG_TAG_COLOR_MUSIC; + } + + return color; +} + +typedef struct { + Gfx* frame; + Gfx* frame_shadow; + Gfx* left_arrow; + Gfx* right_arrow; +} mTG_disp_data_c; + +extern Gfx sen_itemw_wakuT_model[]; +extern Gfx sen_itemw_kage_model[]; +extern Gfx sen_itemw_yajirushi_model[]; +extern Gfx sen_itemw_yajirushi2T_model[]; + +extern Gfx sen_qitem_wakuT_model[]; +extern Gfx sen_qitem_kage_model[]; +extern Gfx sen_qitem_yajirushiT_model[]; +extern Gfx sen_qitem_yajirushi2T_model[]; +extern Gfx sen_qitem_yajirushi3_model[]; +extern Gfx sen_qitem_yajirushi4T_model[]; +extern Gfx sen_qitem_yajirushi5_model[]; +extern Gfx sen_qitem_yajirushi6T_model[]; + +extern Gfx sen_win_wakuT_model[]; +extern Gfx sen_win_kageT_model[]; +extern Gfx sen_win_yajirushiT_model[]; +extern Gfx sen_win_yajirushi2T_model[]; + +extern Gfx sen_item2_DL_mode[]; +extern Gfx sen_win_cursor_model[]; + +static void mTG_set_win_field(GRAPH* graph, Submenu* submenu, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag, f32 pos_x, + f32 pos_y, int win_type, int draw_no) { + // clang-format off + static rgba_t p_col_table[][4] = { + { + { 255, 245, 140, 255 }, + { 190, 235, 245, 255 }, + { 205, 245, 255, 255 }, + { 215, 255, 255, 255 }, + }, + { + { 255, 245, 140, 255 }, + { 205, 195, 255, 255 }, + { 215, 205, 255, 255 }, + { 215, 205, 255, 255 }, + }, + { + { 255, 195, 255, 255 }, + { 215, 215, 255, 255 }, + { 215, 215, 255, 255 }, + { 215, 215, 255, 255 }, + }, + { + { 20, 20, 20, 255 }, + { 20, 20, 20, 255 }, + { 20, 20, 20, 255 }, + { 20, 20, 20, 255 }, + }, + }; + // clang-format on + + // clang-format off + static rgba_t e_col_table[][4] = { + { + { 215, 165, 60, 255 }, + { 120, 120, 200, 255 }, + { 110, 110, 200, 255 }, + { 110, 110, 200, 255 }, + }, + { + { 215, 165, 60, 255 }, + { 110, 110, 140, 255 }, + { 110, 110, 140, 255 }, + { 110, 110, 140, 255 }, + }, + { + { 195, 65, 110, 255 }, + { 150, 75, 250, 255 }, + { 150, 75, 250, 255 }, + { 150, 75, 250, 255 }, + }, + { + { 20, 225, 225, 255 }, + { 20, 225, 225, 255 }, + { 20, 225, 225, 255 }, + { 20, 225, 225, 255 }, + }, + }; + // clang-format on + + // clang-format off + static rgba_t wc_cporiginal_color_e[] = { + { 105, 80, 70, 255 }, + { 60, 50, 35, 255 }, + { 75, 55, 45, 255 }, + { 75, 55, 45, 255 }, + { 65, 45, 15, 255 }, + { 65, 55, 25, 255 }, + { 65, 45, 30, 255 }, + { 65, 55, 50, 255 }, + }; + // clang-format on + + // clang-format off + static rgba_t wc_cporiginal_color_p[] = { + { 255, 245, 160, 255 }, + { 255, 215, 150, 255 }, + { 245, 195, 130, 255 }, + { 225, 175, 110, 255 }, + { 205, 155, 90, 255 }, + { 185, 135, 70, 255 }, + { 165, 115, 50, 255 }, + { 155, 95, 40, 255 }, + }; + // clang-format on + + // clang-format off + static rgba_t wc_cpmail_color_e[] = { + { 255, 125, 35, 255 }, + { 50, 120, 190, 255 }, + { 110, 75, 90, 255 }, + { 70, 130, 90, 255 }, + { 135, 80, 60, 255 }, + { 90, 80, 150, 255 }, + { 130, 90, 90, 255 }, + { 90, 145, 100, 255 }, + }; + // clang-format on + + // clang-format off + static rgba_t wc_cpmail_color_p[] = { + { 255, 215, 40, 255 }, + { 60, 255, 255, 255 }, + { 255, 110, 255, 255 }, + { 75, 225, 165, 255 }, + { 255, 155, 110, 255 }, + { 185, 165, 255, 255 }, + { 255, 125, 150, 255 }, + { 155, 255, 90, 255 }, + }; + // clang-format on + + // clang-format off + static mTG_disp_data_c tag_disp_data[mTG_WIN_NUM] = { + { sen_itemw_wakuT_model, sen_itemw_kage_model, sen_itemw_yajirushi_model, sen_itemw_yajirushi2T_model }, + { sen_qitem_wakuT_model, sen_qitem_kage_model, sen_qitem_yajirushiT_model, sen_qitem_yajirushi2T_model }, + { sen_win_wakuT_model, sen_win_kageT_model, sen_win_yajirushiT_model, sen_win_yajirushi2T_model }, + }; + // clang-format on + + static mTG_disp_data_c quest_up_disp = { + sen_qitem_wakuT_model, + sen_qitem_kage_model, + sen_qitem_yajirushi3_model, + sen_qitem_yajirushi4T_model, + }; + + static mTG_disp_data_c quest_low_disp = { + sen_qitem_wakuT_model, + sen_qitem_kage_model, + sen_qitem_yajirushi5_model, + sen_qitem_yajirushi6T_model, + }; + + static mTG_disp_data_c sel_low_disp = { + sen_win_wakuT_model, + sen_win_kageT_model, + sen_win_yajirushiT_model, + sen_win_yajirushi2T_model, + }; + + // clang-format off + static rgba_t cursol_color[] = { + { 215, 30, 215, 255 }, + { 235, 60, 60, 255 }, + { 255, 0, 255, 255 }, + { 0, 255, 255, 255 }, + }; + // clang-format on + + mTG_Ovl_c* tag_ovl; + mTG_disp_data_c* disp_data_p; + mTG_tag_data_c* tag_data_p; + rgba_t* color_p; + int special_color; + + tag_ovl = submenu->overlay->tag_ovl; + tag_data_p = &mTG_label_table[tag->type]; + special_color = mTG_get_special_color(menu_info, tag); + disp_data_p = &tag_disp_data[win_type]; + + if (win_type == mTG_WIN_QITEM) { + if (mTG_quest_disp_up_check(tag) == TRUE) { + disp_data_p = &quest_up_disp; + } else if (mTG_quest_disp_low_check(tag) == TRUE) { + disp_data_p = &quest_low_disp; + } + } else if (win_type == mTG_WIN_SELECT && (tag->flags & mTG_TAG_FLAG_EDGE_FOOT_SELECT) == 0 && + tag_ovl->sel_tag_idx == 1) { + disp_data_p = &sel_low_disp; + } + + /* Setup tag DL env */ + Matrix_scale(16.0f, 16.0f, 1.0f, 0); + Matrix_translate(tag->base_pos[0] + pos_x, tag->base_pos[1] + pos_y, 140.0f, 1); + Matrix_scale(tag->scale, tag->scale, 1.0f, 1); + + OPEN_POLY_OPA_DISP(graph); + gSPDisplayList(POLY_OPA_DISP++, sen_item2_DL_mode); + gDPSetAlphaCompare(POLY_OPA_DISP++, G_AC_THRESHOLD); + gDPSetBlendColor(POLY_OPA_DISP++, 255, 255, 255, 40); + + /* Draw window shadow */ + Matrix_push(); + Matrix_translate(tag->body_ofs[0], tag->body_ofs[1], 0.0f, 1); + Matrix_scale(tag->body_scale[0] * tag->_34, tag->body_scale[1] * tag->_34, 1.0f, 1); + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, disp_data_p->frame_shadow); + Matrix_pull(); + + /* Draw arrow */ + if (tag->arrow_dir != 0) { + Matrix_push(); + Matrix_scale(tag->arrow_scale[0], tag->arrow_scale[1], 1.0f, 1); + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (tag->table == mTG_TABLE_CPORIGINAL_WC) { + color_p = &wc_cporiginal_color_e[tag->tag_row]; + } else if (tag->table == mTG_TABLE_CPMAIL_WC) { + color_p = &wc_cpmail_color_e[tag->tag_row]; + } else { + color_p = &e_col_table[special_color][draw_no]; + } + + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, color_p->r, color_p->g, color_p->b, 255); + + if (tag->arrow_dir == 1) { + gSPDisplayList(POLY_OPA_DISP++, disp_data_p->left_arrow); + } else { + gSPDisplayList(POLY_OPA_DISP++, disp_data_p->right_arrow); + } + + Matrix_pull(); + } + + if (tag->table == mTG_TABLE_CPORIGINAL_WC) { + color_p = &wc_cporiginal_color_p[tag->tag_row]; + gDPSetPrimColor(POLY_OPA_DISP++, 0, 128, color_p->r, color_p->g, color_p->b, 255); + color_p = &wc_cporiginal_color_e[tag->tag_row]; + gDPSetEnvColor(POLY_OPA_DISP++, color_p->r, color_p->g, color_p->b, 150); + } else if (tag->table == mTG_TABLE_CPMAIL_WC) { + color_p = &wc_cpmail_color_p[tag->tag_row]; + gDPSetPrimColor(POLY_OPA_DISP++, 0, 128, color_p->r, color_p->g, color_p->b, 255); + color_p = &wc_cpmail_color_e[tag->tag_row]; + gDPSetEnvColor(POLY_OPA_DISP++, color_p->r, color_p->g, color_p->b, 150); + } else { + color_p = &p_col_table[special_color][draw_no]; + gDPSetPrimColor(POLY_OPA_DISP++, 0, 128, color_p->r, color_p->g, color_p->b, 255); + color_p = &e_col_table[special_color][draw_no]; + gDPSetEnvColor(POLY_OPA_DISP++, color_p->r, color_p->g, color_p->b, 150); + } + + /* Draw window */ + Matrix_push(); + Matrix_translate(tag->body_ofs[0], tag->body_ofs[1], 0.0f, 1); + Matrix_scale(tag->body_scale[0] * tag->_34, tag->body_scale[1] * tag->_34, 1.0f, 1); + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, disp_data_p->frame); + Matrix_pull(); + + if (tag_data_p->words != NULL && tag->type != mTG_TYPE_HANIWA_PRICE) { + f32 cursor_ofs; + f32 x; + f32 y; + + if (tag->type == mTG_TYPE_CP_DELETE2) { + cursor_ofs = (f32)(2 + tag->tag_row); + } else if (tag->type == mTG_TYPE_DUMP_MAIL || tag->type == mTG_TYPE_DUMP_ITEM || + tag->type == mTG_TYPE_DUMP_MAIL_MARK_CONF) { + cursor_ofs = (f32)(1 + tag->tag_row); + } else if (tag->type == mTG_TYPE_TAG_PUT_CHK) { + cursor_ofs = (f32)(2 + tag->tag_row); + } else { + cursor_ofs = (f32)tag->tag_row; + } + + x = tag->text_ofs[0] + (tag->_34 * -4.0f + tag->body_ofs[0]); + y = (tag->text_ofs[1] + (tag->_34 * -8.0f + tag->body_ofs[1])) - cursor_ofs * 16.0f * tag->_34; + Matrix_translate(x, y, 0.0f, 1); + gSPMatrix(POLY_OPA_DISP++, _Matrix_to_Mtx_new(graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + color_p = &cursol_color[special_color]; + gDPSetPrimColor(POLY_OPA_DISP++, 0, 255, color_p->r, color_p->g, color_p->b, 255); + gSPDisplayList(POLY_OPA_DISP++, sen_win_cursor_model); + } + + /* Cleanup */ + gDPSetAlphaCompare(POLY_OPA_DISP++, G_AC_NONE); + gDPSetBlendColor(POLY_OPA_DISP++, 255, 255, 255, 8); + + CLOSE_POLY_OPA_DISP(graph); +} + +static void mTG_price_draw(Submenu* submenu, GAME* game, f32 pos_x, f32 pos_y, f32 scale, f32 ofs_x, f32 ofs_y, + mTG_tag_c* tag) { + static int sel_col[] = { 255, 20, 20 }; + static int not_sel_col[] = { 155, 50, 95 }; + u8 price_str[6]; + u32 price = submenu->overlay->haniwa_ovl->price; + int col = tag->tag_col; + int* color_p; + mTG_tag_data_c* tag_data_p = &mTG_label_table[tag->type]; + mTG_tag_word_c** words_p = tag_data_p->words; + mTG_tag_word_c* word_p; + int i; + + // clang-format off + mFont_SetLineStrings( + game, + words_p[0]->str, mTG_TAG_STR_LEN, + pos_x, pos_y, + mTG_select_col_type_on[0].r, mTG_select_col_type_on[0].g, mTG_select_col_type_on[0].b, 255, + FALSE, + TRUE, + scale, scale, + mFont_MODE_POLY + ); + // clang-format on + + mFont_UnintToString(price_str, sizeof(price_str), price, sizeof(price_str) - 1, FALSE, TRUE, TRUE); + + pos_x += 7.0f * scale; + pos_y += ofs_y; + + // clang-format off + mFont_SetLineStrings( + game, + /* @BUG - this should definitely be words_p[1]->str, only works since the second item is sequential in data */ +#ifndef BUGFIXES + words_p[0][1].str, mTG_TAG_STR_LEN, +#else + words_p[1]->str, mTG_TAG_STR_LEN, +#endif + pos_x + scale * (5 + mFont_GetStringWidth(price_str, sizeof(price_str), TRUE)), pos_y, + mTG_select_col_type_on[0].r, mTG_select_col_type_on[0].g, mTG_select_col_type_on[0].b, 255, + FALSE, + TRUE, + scale, scale, + mFont_MODE_POLY + ); + // clang-format on + + /* Skip comma */ + if (col >= 2) { + col++; + } + + for (i = 0; i < (int)sizeof(price_str); i++) { + if (i == col) { + color_p = sel_col; + } else if (i == 2) { + color_p = not_sel_col; + } else { + color_p = not_sel_col; + } + + // clang-format off + mFont_SetLineStrings( + game, + &price_str[i], 1, + pos_x, pos_y, + color_p[0], color_p[1], color_p[2], 255, + FALSE, + TRUE, + scale, scale, + mFont_MODE_POLY + ); + // clang-format on + + pos_x += scale * (f32)mFont_GetStringWidth(&price_str[i], 1, TRUE); + } +} + +static void mTG_set_questItemInfo_sub(GAME* game, u8* str, int max_len, f32 x, f32 y, f32 scale) { + int len = mMl_strlen(str, max_len, CHAR_SPACE); + + // clang-format off + mFont_SetLineStrings( + game, + str, len, + x, y, + 90, 60, 50, 255, + FALSE, + TRUE, + scale, scale, + mFont_MODE_POLY + ); + // clang-format on +} + +static void mTG_set_questItemInfo(GAME* game, mTG_tag_c* tag, f32 pos_x, f32 pos_y, f32 scale, f32 ofs_x, f32 ofs_y) { + static int draw_turn_normal[] = { mTG_STR2, mTG_STR0, mTG_STR1 }; + static int draw_turn_omikuji[] = { mTG_STR0, mTG_STR2, mTG_STR1 }; + u8* str_p; + int len; + int* draw_turn_p = tag->str2_type == mTG_QSTR_TYPE_OMIKUJI ? draw_turn_omikuji : draw_turn_normal; + int i; + + for (i = 0; i < mTG_STR_NUM; i++, draw_turn_p++) { + switch (*draw_turn_p) { + case mTG_STR0: + str_p = tag->str0; + len = mTG_TAG_SEL_STRING_LEN; + break; + case mTG_STR1: + str_p = tag->str1; + len = mTG_TAG_SEL_STRING_LEN; + break; + case mTG_STR2: + str_p = tag->str2; + len = mTG_TAG_SEL_STRING_LEN; + break; + } + + mTG_set_questItemInfo_sub(game, str_p, len, pos_x, pos_y, scale); + pos_y += ofs_y; + } +} + +static void mTG_set_select(GAME* game, mSM_MenuInfo_c* menu_info, mTG_tag_c* tag, mTG_tag_word_c** words_p, int n_words, + f32 pos_x, f32 pos_y, f32 scale, f32 ofs) { + rgba_t* color_p; + int special_color; + int i; + + special_color = mTG_get_special_color(menu_info, tag); + for (i = 0; i < n_words; i++) { + if (i == tag->tag_row) { + color_p = &mTG_select_col_type_on[special_color]; + } else { + color_p = &mTG_select_col_type_off[special_color]; + } + + // clang-format off + mFont_SetLineStrings( + game, + words_p[0]->str, mTG_TAG_STR_LEN, + pos_x, pos_y, + color_p->r, color_p->g, color_p->b, 255, + FALSE, + TRUE, + scale, scale, + mFont_MODE_POLY + ); + // clang-format on + + words_p++; + pos_y += ofs; + } +} + +static void mTG_set_character(Submenu* submenu, mSM_MenuInfo_c* menu_info, GAME* game, GRAPH* graph, mTG_tag_c* tag, + f32 base_x, f32 base_y) { + f32 scale_rate = tag->scale * 0.875f; + + if (!F32_IS_ZERO(tag->scale)) { + f32 pos_x = 160.0f + (tag->base_pos[0] + base_x + tag->scale * (tag->body_ofs[0] + tag->text_ofs[0])); + f32 pos_y = 120.0f - (tag->base_pos[1] + base_y + tag->scale * (tag->body_ofs[1] + tag->text_ofs[1])); + mTG_tag_data_c* tag_data_p = &mTG_label_table[tag->type]; + + submenu->overlay->set_char_matrix_proc(graph); + if (tag->type == mTG_TYPE_CP_DELETE2) { + // clang-format off + mFont_SetLineStrings( + game, + mTG_tag_str_hontoni, sizeof(mTG_tag_str_hontoni), + pos_x, pos_y, + 140, 60, 255, 255, + FALSE, + TRUE, + scale_rate, scale_rate, + mFont_MODE_POLY + ); + // clang-format on + pos_y += 16.0f * scale_rate; + + // clang-format off + mFont_SetLineStrings( + game, + mTG_tag_str_iidesuka, sizeof(mTG_tag_str_iidesuka), + pos_x, pos_y, + 140, 60, 255, 255, + FALSE, + TRUE, + scale_rate, scale_rate, + mFont_MODE_POLY + ); + // clang-format on + pos_y += 16.0f * scale_rate; + } else if (tag->type == mTG_TYPE_DUMP_MAIL || tag->type == mTG_TYPE_DUMP_ITEM || + tag->type == mTG_TYPE_DUMP_MAIL_MARK_CONF) { + // clang-format off + mFont_SetLineStrings( + game, + mTG_tag_str_suteruno, sizeof(mTG_tag_str_suteruno), + pos_x, pos_y, + 220, 30, 220, 255, + FALSE, + TRUE, + scale_rate, scale_rate, + mFont_MODE_POLY + ); + // clang-format on + pos_y += 16.0f * scale_rate; + } else if (tag->type == mTG_TYPE_TAG_PUT_CHK) { + // clang-format off + mFont_SetLineStrings( + game, + mTG_tag_str_put_chk1, sizeof(mTG_tag_str_put_chk1), + pos_x, pos_y, + 220, 30, 220, 255, + FALSE, + TRUE, + scale_rate, scale_rate, + mFont_MODE_POLY + ); + // clang-format on + pos_y += 16.0f * scale_rate; + + // clang-format off + mFont_SetLineStrings( + game, + mTG_tag_str_put_chk2, sizeof(mTG_tag_str_put_chk2), + pos_x, pos_y, + 220, 30, 220, 255, + FALSE, + TRUE, + scale_rate, scale_rate, + mFont_MODE_POLY + ); + // clang-format on + pos_y += 16.0f * scale_rate; + } + + if (tag->type == mTG_TYPE_HANIWA_PRICE) { + mTG_price_draw(submenu, game, pos_x, pos_y, scale_rate, 12.0f * scale_rate, 16.0f * scale_rate, tag); + } else { + mTG_set_select(game, menu_info, tag, tag_data_p->words, tag_data_p->lines, pos_x, pos_y, scale_rate, + 16.0f * scale_rate); + } + } +} + +static void mTG_set_character_item(Submenu* submenu, GAME* game, GRAPH* graph, mTG_tag_c* tag, f32 base_x, f32 base_y) { + static rgba_t item_name_color[] = { + { 90, 60, 50, 255 }, + { 40, 30, 30, 255 }, + }; + static rgba_t wc_cporiginal_color_char[] = { + { 80, 50, 50, 255 }, { 80, 50, 50, 255 }, { 80, 50, 50, 255 }, { 70, 50, 50, 255 }, + { 70, 50, 50, 255 }, { 60, 40, 40, 255 }, { 60, 40, 40, 255 }, { 50, 30, 30, 255 }, + }; + static rgba_t wc_cpmail_color_char[] = { + { 70, 40, 20, 255 }, { 20, 60, 90, 255 }, { 60, 30, 70, 255 }, { 10, 70, 50, 255 }, + { 70, 50, 20, 255 }, { 60, 50, 70, 255 }, { 70, 20, 30, 255 }, { 50, 70, 10, 255 }, + }; + f32 scale_rate = tag->scale; + + if (!F32_IS_ZERO(scale_rate)) { + f32 pos_x; + f32 pos_y; + rgba_t* color_p; + + if (tag->table == mTG_TABLE_CATALOG_WC) { + color_p = &item_name_color[1]; + } else if (tag->table == mTG_TABLE_CPORIGINAL_WC) { + color_p = &wc_cporiginal_color_char[tag->tag_row]; + } else if (tag->table == mTG_TABLE_CPMAIL_WC) { + color_p = &wc_cpmail_color_char[tag->tag_row]; + } else { + color_p = &item_name_color[0]; + } + + pos_x = 160.0f + (tag->base_pos[0] + base_x + scale_rate * (tag->body_ofs[0] + tag->text_ofs[0])); + pos_y = 120.0f - (tag->base_pos[1] + base_y + scale_rate * (tag->body_ofs[1] + tag->text_ofs[1])); + + submenu->overlay->set_char_matrix_proc(graph); + + // clang-format off + mFont_SetLineStrings( + game, + tag->str0, mTG_TAG_STR_LEN, + pos_x, pos_y, + color_p->r, color_p->g, color_p->b, 255, + FALSE, + TRUE, + scale_rate * 0.875f, scale_rate * 0.875f, + mFont_MODE_POLY + ); + // clang-format on + } +} + +static void mTG_set_character_q_item(Submenu* submenu, GAME* game, GRAPH* graph, mTG_tag_c* tag, f32 base_x, + f32 base_y) { + f32 scale_rate = tag->scale; + + if (!F32_IS_ZERO(scale_rate)) { + f32 pos_x; + f32 pos_y; + + pos_x = 160.0f + (tag->base_pos[0] + base_x + scale_rate * (tag->body_ofs[0] + tag->text_ofs[0])); + pos_y = 120.0f - (tag->base_pos[1] + base_y + scale_rate * (tag->body_ofs[1] + tag->text_ofs[1])); + + submenu->overlay->set_char_matrix_proc(graph); + scale_rate *= 0.75f; + mTG_set_questItemInfo(game, tag, pos_x, pos_y, scale_rate, 12.0f * scale_rate, 16.0f * scale_rate); + } +} + +static void mTG_set_dl(Submenu* submenu, mSM_MenuInfo_c* menu_info, GRAPH* graph, GAME* game, mTG_tag_c* tag, + f32 base_x, f32 base_y, int draw_no) { + if (tag->type == mTG_TYPE_NONE) { + if (tag->arrow_dir != 0) { + if (tag->str2_type != mTG_QSTR_TYPE_NONE) { + mTG_set_win_field(graph, submenu, menu_info, tag, base_x, base_y, mTG_WIN_QITEM, 0); + mTG_set_character_q_item(submenu, game, graph, tag, base_x, base_y); + } else { + mTG_set_win_field(graph, submenu, menu_info, tag, base_x, base_y, mTG_WIN_ITEM, 0); + mTG_set_character_item(submenu, game, graph, tag, base_x, base_y); + } + } + } else { + mTG_set_win_field(graph, submenu, menu_info, tag, base_x, base_y, mTG_WIN_SELECT, draw_no); + mTG_set_character(submenu, menu_info, game, graph, tag, base_x, base_y); + } +} + +extern Gfx inv_item_shadow_mode[]; +extern Gfx inv_item_mode[]; + +static void mTG_draw_mail(Submenu* submenu, GRAPH* graph, Mail_c* mail, f32 x, f32 y) { + OPEN_POLY_OPA_DISP(graph); + gSPDisplayList(POLY_OPA_DISP++, inv_item_shadow_mode); + CLOSE_POLY_OPA_DISP(graph); + submenu->overlay->draw_mail_proc(graph, x + 4.0f, y - 4.0f, 1.0f, mail, TRUE, TRUE, FALSE); + + OPEN_POLY_OPA_DISP(graph); + gSPDisplayList(POLY_OPA_DISP++, inv_item_mode); + CLOSE_POLY_OPA_DISP(graph); + submenu->overlay->draw_mail_proc(graph, x, y, 1.0f, mail, TRUE, FALSE, FALSE); +} + +static void mTG_single_draw_mail(Submenu* submenu, GRAPH* graph, mTG_Ovl_c* tag_ovl) { + Mail_c* mail; + int i; + mTG_cpmail_mark_pos_c* mark_pos = tag_ovl->_2F4; + + for (i = 0; i < 4; i++) { + f32 x = mark_pos->pos[0]; + f32 y = mark_pos->pos[1]; + + mail = mark_pos->_00; + if (mail != NULL && mMl_check_not_used_mail(mail) == FALSE) { + mTG_draw_mail(submenu, graph, mail, x, y); + } + + mark_pos++; + } +} + +static void mTG_single_draw_original(Submenu* submenu, GRAPH* graph, mTG_Ovl_c* tag_ovl) { + mActor_name_t item; + int i; + mTG_cporiginal_mark_entry_c* entry_p = tag_ovl->original_entries; + + for (i = 0; i < mTG_ORG_TYPE_NUM; i++) { + f32 x = entry_p->pos[0]; + f32 y = entry_p->pos[1]; + + item = entry_p->item; + if (item != EMPTY_NO) { + mSM_draw_original(submenu, graph, x, y, 1.0f, item, FALSE); + } + + entry_p++; + } +} + +static void mTG_draw_func(Submenu* submenu, GAME* game, int menu_type) { + if (submenu->menu_type == menu_type) { + GRAPH* graph = game->graph; + Submenu_Overlay_c* overlay_p = submenu->overlay; + mTG_Ovl_c* tag_ovl = overlay_p->tag_ovl; + mTG_tag_c* tag; + mSM_MenuInfo_c* menu_info = &overlay_p->menu_info[menu_type]; + int i; + int max; + + if (menu_info->proc_status != mSM_OVL_PROC_MOVE && menu_info->proc_status != mSM_OVL_PROC_END) { + mTG_single_draw_mail(submenu, graph, tag_ovl); + mTG_single_draw_original(submenu, graph, tag_ovl); + + if ((tag_ovl->nw_gba_flags & 0x8) == 0) { + submenu->overlay->menu_control.hand_draw_func(submenu, game); + } + + max = overlay_p->tag_ovl->sel_tag_idx + 1; + tag = overlay_p->tag_ovl->tags; + for (i = 0; i < max; i++, tag++) { + mTG_set_dl(submenu, menu_info, graph, game, tag, menu_info->position[0], menu_info->position[1], i); + } + + if ((tag_ovl->nw_gba_flags & 0x8) != 0) { + submenu->overlay->menu_control.hand_draw_func(submenu, game); + } + } + } +} + +extern void mTG_tag_ovl_construct(Submenu* submenu) { + Submenu_Overlay_c* overlay_p = submenu->overlay; + mSM_Control_c* menu_control = &overlay_p->menu_control; + mTG_Ovl_c* tag_ovl_p; + mTG_tag_c* tag; + int i; + + if (submenu->overlay->tag_ovl == NULL) { + mem_clear((u8*)&tag_ovl_data, sizeof(tag_ovl_data), 0); + menu_control->tag_move_func = &mTG_move_func; + menu_control->tag_draw_func = &mTG_draw_func; + + tag_ovl_p = &tag_ovl_data; + overlay_p->tag_ovl = tag_ovl_p; + + submenu->overlay->tag_ovl->set_hand_pos_proc = &mTG_set_hand_pos; + submenu->overlay->tag_ovl->init_tag_data_item_win_proc = &mTG_init_tag_data_item_win; + submenu->overlay->tag_ovl->chg_tag_func_proc = &mTG_chg_tag_func; + submenu->overlay->tag_ovl->get_table_idx_proc = &mTG_get_table_idx; + submenu->overlay->tag_ovl->get_mail_pointer_proc = &mTG_get_mail_pointer; + submenu->overlay->tag_ovl->exchange_proc = &mTG_exchange_proc; + + tag = tag_ovl_p->tags; + for (i = 0; i < mTG_TAG_NUM; i++, tag++) { + tag->type = mTG_TYPE_NONE; + } + + tag_ovl_p->sel_tag_idx = -1; + tag_ovl_p->ret_tag_idx = -1; + } +} + +extern void mTG_tag_ovl_destruct(Submenu* submenu) { + submenu->overlay->tag_ovl = NULL; +}