#include "m_submenu.h" #include "m_common_data.h" #include "m_debug.h" #include "m_lib.h" #include "m_msg_main.h" #include "m_player_lib.h" #include "fault.h" #include "ovlmgr.h" #include "game.h" #include "sys_math3d.h" #include "m_scene.h" #include "m_quest.h" #include "audio.h" #include "libc/stddef.h" #include "attributes.h" #include "segment_symbols.h" #include "macros.h" #include "prevent_bss_reordering.h" #include "overlays/gamestates/ovl_play/m_play.h" #include "overlays/actors/player_actor/m_player.h" #include "overlays/submenu/submenu_ovl/m_submenu_ovl.h" FaultClient B_80144670_jp; FaultAddrConvClient B_80144680_jp; void* D_8010DCE0_jp = NULL; size_t D_8010DCE4_jp = 0; typedef enum SubmenuAreaIndex { /* 0 */ SUBMENU_AREA_INDEX_SUBMENU, /* 1 */ SUBMENU_AREA_INDEX_PLAYER, /* 2 */ SUBMENU_AREA_INDEX_MAX } SubmenuAreaIndex; typedef struct SubmenuArea { /* 0x00 */ void* allocatedRamAddr; /* 0x04 */ RomOffset vromStart; /* 0x08 */ RomOffset vromEnd; /* 0x0C */ void* vramStart; /* 0x10 */ void* vramEnd; /* 0x14 */ ptrdiff_t relocationDiff; /* 0x18 */ const char* name; } SubmenuArea; // size = 0x1C #define SUBMENU_OVERLAY(name) \ { NULL, SEGMENT_ROM_START(name), SEGMENT_ROM_END(name), SEGMENT_VRAM_START(name), SEGMENT_VRAM_END(name), 0, #name } SubmenuArea* SubmenuArea_visit = NULL; SubmenuArea SubmenuArea_dlftbl[SUBMENU_AREA_INDEX_MAX] = { SUBMENU_OVERLAY(submenu_ovl), // SUBMENU_AREA_INDEX_SUBMENU SUBMENU_OVERLAY(player_actor), // SUBMENU_AREA_INDEX_PLAYER }; s32 SubmenuArea_IsPlayer(void) { SubmenuArea* playerActorOvl = &SubmenuArea_dlftbl[SUBMENU_AREA_INDEX_PLAYER]; return SubmenuArea_visit == playerActorOvl; } #ifdef NON_MATCHING // regalloc void mSM_load_player_anime(Game_Play* game_play) { ObjectStatus* var_s4; s32 var_s0; s32 var_s3; Player* temp_v0; void* segment; temp_v0 = get_player_actor_withoutCheck(game_play); if (temp_v0 == NULL) { return; } var_s4 = game_play->objectExchangeBank.status; var_s4 += mSc_bank_regist_check(&game_play->objectExchangeBank, 9); for (var_s3 = 0; var_s3 < 2; var_s3++, var_s4++) { segment = var_s4->segment; if (var_s3 == 0) { func_800B1D94_jp(segment, temp_v0->unk_0DAC); } else { func_800B1D94_jp(segment, temp_v0->unk_0DB0); //! FAKE if (segment && segment) {} } var_s0 = temp_v0->unk_0DBC[var_s3]; if (temp_v0->unk_0DDC[var_s3] >= 0) { func_800B167C_jp(var_s0, temp_v0->unk_0DDC[var_s3]); var_s0 += func_800B131C_jp(temp_v0->unk_0DDC[var_s3]); } if (temp_v0->unk_0DE4[var_s3] >= 0) { func_800B167C_jp(var_s0, temp_v0->unk_0DE4[var_s3]); } } } #else void mSM_load_player_anime(Game_Play* game_play); #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_load_player_anime.s") #endif void SubmenuArea_DoLink(SubmenuArea* area, Submenu* submenu, SubmenuAreaIndex index) { area->allocatedRamAddr = D_8010DCE0_jp; if (index == SUBMENU_AREA_INDEX_PLAYER) { size_t ovlSize = ALIGN16((uintptr_t)area->vramEnd - (uintptr_t)area->vramStart); size_t size; struct OverlayRelocationSection* ovl; if (D_8010DCE4_jp >= ovlSize) { size = D_8010DCE4_jp - ovlSize; ovl = (void*)((uintptr_t)D_8010DCE0_jp + ovlSize); } else { size = 0; ovl = NULL; } ovlmgr_LoadImpl(area->vromStart, area->vromEnd, area->vramStart, area->vramEnd, area->allocatedRamAddr, ovl, size); } else { ovlmgr_Load(area->vromStart, area->vromEnd, area->vramStart, area->vramEnd, area->allocatedRamAddr); } area->relocationDiff = (uintptr_t)area->allocatedRamAddr - (uintptr_t)area->vramStart; SubmenuArea_visit = area; submenu->linkedAllocStart = area->allocatedRamAddr; submenu->linkedAllocEnd = (void*)((uintptr_t)area->allocatedRamAddr + ALIGN64((uintptr_t)area->vramEnd - (uintptr_t)area->vramStart)); } void SubmenuArea_DoUnlink(SubmenuArea* area, Submenu* submenu) { if (area->allocatedRamAddr == NULL) { return; } submenu->linkedAllocStart = area->allocatedRamAddr; submenu->linkedAllocEnd = area->allocatedRamAddr; area->relocationDiff = 0; bzero(area->allocatedRamAddr, (uintptr_t)area->vramEnd - (uintptr_t)area->vramStart); area->allocatedRamAddr = NULL; SubmenuArea_visit = NULL; } s32 mSM_ovlptr_dllcnv_sub(void* vram, SubmenuArea* area, Submenu* submenu) { SubmenuAreaIndex index; s32 len = SUBMENU_AREA_INDEX_MAX; for (index = 0; index < len; index++) { if ((vram >= area->vramStart) && (vram <= area->vramEnd)) { SubmenuArea_DoLink(area, submenu, index); return 1; } } return 0; } void* mSM_ovlptr_dllcnv(void* vram, Submenu* submenu) { SubmenuArea* area = SubmenuArea_visit; if (area == NULL) { area = SubmenuArea_dlftbl; if (!mSM_ovlptr_dllcnv_sub(vram, SubmenuArea_dlftbl, submenu)) { return NULL; } } if ((area == NULL) || (vram < area->vramStart) || (vram >= area->vramEnd)) { return NULL; } return (void*)((uintptr_t)vram + area->relocationDiff); } void func_800C47B4_jp(UNUSED void* arg0, UNUSED void* arg1) { void* temp_s0; Player* temp_v0_3; UNUSED void* temp_v0_2; OSThread* temp_v0; u32 temp_a3; // sp34 u32 var_t1; // sp30 u32 var_t0; // sp2C size_t ovlSize; void* temp_a2; // sp20 temp_v0 = fault_class.faultedThread; var_t0 = (temp_v0 != NULL) ? temp_v0->context.pc : 0; var_t1 = (temp_v0 != NULL) ? temp_v0->context.ra : 0; FaultDrawer_Printf("SubmenuArea_visit\n"); FaultDrawer_Printf("RamStart-RamEnd Offset\n"); if (SubmenuArea_visit == NULL) { return; } ovlSize = (uintptr_t)SubmenuArea_visit->vramEnd - (uintptr_t)SubmenuArea_visit->vramStart; temp_s0 = SubmenuArea_visit->allocatedRamAddr; temp_a3 = (uintptr_t)SubmenuArea_visit->vramStart - (uintptr_t)temp_s0; temp_a2 = (void*)((uintptr_t)temp_s0 + ovlSize); if (temp_s0 != NULL) { FaultDrawer_Printf("%08x-%08x %06x", temp_s0, temp_a2, temp_a3); if ((var_t0 >= (u32)temp_s0) && (var_t0 < (u32)temp_a2)) { FaultDrawer_Printf(" PC:%08x", var_t0 + temp_a3); } else if ((var_t1 >= (u32)temp_s0) && (var_t1 < (u32)temp_a2)) { FaultDrawer_Printf(" RA:%08x", var_t1 + temp_a3); } FaultDrawer_Printf("\n"); temp_v0_3 = get_player_actor_withoutCheck((Game_Play*)gamePT); if (temp_v0_3 != NULL) { FaultDrawer_Printf("\n"); FaultDrawer_Printf("player infomation\n"); FaultDrawer_Printf("main_index :%d %d\n", temp_v0_3->unk_0CF0, temp_v0_3->unk_0CF4); FaultDrawer_Printf("request_main_index :%d %d %d\n", temp_v0_3->unk_0D00, temp_v0_3->unk_0D04, temp_v0_3->unk_0D08); FaultDrawer_Printf("pos :%d %d %d\n", (s32)temp_v0_3->actor.world.pos.x, (s32)temp_v0_3->actor.world.pos.y, (s32)temp_v0_3->actor.world.pos.z); FaultDrawer_Printf("angleY :%d %d\n", temp_v0_3->actor.world.rot.y, temp_v0_3->actor.shape.rot.y); } } } uintptr_t func_800C497C_jp(uintptr_t address, UNUSED void* param) { uintptr_t addr = address; if (SubmenuArea_visit != NULL) { size_t ovlSize = ((uintptr_t)SubmenuArea_visit->vramEnd - (uintptr_t)SubmenuArea_visit->vramStart); uintptr_t loadedRamAddr = (uintptr_t)SubmenuArea_visit->allocatedRamAddr; size_t relocationDiff = (uintptr_t)SubmenuArea_visit->vramStart - loadedRamAddr; if (loadedRamAddr != NULL) { if ((addr >= loadedRamAddr) && (addr < loadedRamAddr + ovlSize)) { return addr + relocationDiff; } } } return (uintptr_t)NULL; } void mSM_submenu_ovlptr_init(Game_Play* game_play) { size_t temp6 = ALIGN64(SEGMENT_VRAM_SIZE(ovl__00792700)); size_t temp7 = ALIGN64(SEGMENT_VRAM_SIZE(ovl__0079A290)); size_t temp8 = ALIGN64(SEGMENT_VRAM_SIZE(ovl__0079E430)); size_t temp9 = ALIGN64(SEGMENT_VRAM_SIZE(ovl__0079F810)); size_t submenuOvlSize = ALIGN64(SEGMENT_VRAM_SIZE(submenu_ovl)); size_t temp_a0 = ALIGN64(SEGMENT_VRAM_SIZE(tag_ovl)); size_t var_t0 = temp6 + temp7; size_t temp10; size_t temp1; size_t temp2; size_t temp3; size_t temp4; size_t temp5; size_t var_a3; size_t playerOvlSize; size_t var_s0; var_t0 = MAX(temp8 + temp9, var_t0); temp10 = ALIGN64(SEGMENT_VRAM_SIZE(hand_ovl)); temp1 = ALIGN64(SEGMENT_VRAM_SIZE(inventory_ovl)); temp2 = ALIGN64(SEGMENT_VRAM_SIZE(board_ovl)); temp3 = ALIGN64(SEGMENT_VRAM_SIZE(ovl__0078CB80)); temp4 = ALIGN64(SEGMENT_VRAM_SIZE(ovl__00799580)); temp5 = ALIGN64(SEGMENT_VRAM_SIZE(catalog_ovl)); var_a3 = submenuOvlSize + temp1 + temp_a0 + temp10 + temp2 + temp3 + temp4 + var_t0; var_a3 = MAX(submenuOvlSize + temp_a0 + temp10 + temp5 + 0x4000, var_a3); playerOvlSize = SEGMENT_VRAM_SIZE(player_actor); var_s0 = MAX(var_a3, playerOvlSize); PLAYERREG(81) = (var_s0 >> 0x10) & 0xFFFF; PLAYERREG(82) = var_s0 & 0xFFFF; PLAYERREG(83) = (playerOvlSize >> 0x10) & 0xFFFF; PLAYERREG(84) = playerOvlSize & 0xFFFF; PLAYERREG(85) = (var_a3 >> 0x10) & 0xFFFF; PLAYERREG(86) = var_a3 & 0xFFFF; //! FAKE dummy_label_255895: D_8010DCE0_jp = THA_alloc16(&game_play->state.heap, var_s0); D_8010DCE4_jp = var_s0; SubmenuArea_visit = NULL; fault_AddClient(&B_80144670_jp, func_800C47B4_jp, NULL, NULL); fault_AddressConverterAddClient(&B_80144680_jp, func_800C497C_jp, NULL); } void mSM_submenu_ovlptr_cleanup(Submenu* submenu) { fault_RemoveClient(&B_80144670_jp); fault_AddressConverterRemoveClient(&B_80144680_jp); if (SubmenuArea_visit != NULL) { SubmenuArea_DoUnlink(SubmenuArea_visit, submenu); SubmenuArea_visit = NULL; } // One of those two is SubmenuArea_allocp D_8010DCE0_jp = 0; D_8010DCE4_jp = 0; } void load_player(Submenu* submenu) { SubmenuArea* playerActorOvl = &SubmenuArea_dlftbl[SUBMENU_AREA_INDEX_PLAYER]; if (SubmenuArea_visit == playerActorOvl) { return; } if (SubmenuArea_visit != NULL) { SubmenuArea_DoUnlink(SubmenuArea_visit, submenu); } SubmenuArea_DoLink(playerActorOvl, submenu, SUBMENU_AREA_INDEX_PLAYER); } void mSM_submenu_ct(Submenu* submenu) { bzero(submenu, sizeof(Submenu)); submenu->moveProcIndex = MSM_MOVE_PROC_WAIT; submenu->unk_20 = 0; if (common_data.unk_104AD == 1) { submenu->unk_E2 = 1; common_data.unk_104AD = 0; } submenu->move = (void*)none_proc1; submenu->draw = (void*)none_proc1; } void mSM_submenu_dt(UNUSED Submenu* submenu) { } void mSM_open_submenu(Submenu* submenu, SubmenuProgramId programId, s32 arg2, s32 arg3) { mSM_open_submenu_new2(submenu, programId, arg2, arg3, 0, 0); } void mSM_open_submenu_new(Submenu* submenu, SubmenuProgramId programId, s32 arg2, s32 arg3, s32 arg4) { mSM_open_submenu_new2(submenu, programId, arg2, arg3, arg4, 0); } void mSM_open_submenu_new2(Submenu* submenu, SubmenuProgramId programId, s32 arg2, s32 arg3, s32 arg4, s32 arg5) { submenu->programId = programId; submenu->unk_10 = arg2; submenu->unk_14 = arg3; submenu->unk_18 = arg4; submenu->unk_1C = arg5; } void mSM_Reset_player_btn_type1(Game_Play* game_play) { Player* player = get_player_actor_withoutCheck(game_play); if (player != NULL) { player->unk_12B8 = 0; player->unk_12BC = 1; } } void mSM_Reset_player_btn_type2(Game_Play* game_play) { Player* player = get_player_actor_withoutCheck(game_play); if (player != NULL) { player->unk_12BC = 1; } } void mSM_submenu_ctrl(Game_Play* game_play) { Submenu* submenu = &game_play->submenu; if ((game_play->submenu.moveProcIndex != MSM_MOVE_PROC_WAIT) || (game_play->unk_1EE0 != 0) || (game_play->unk_1EE3 != 0)) { return; } if ((!((chkTrigger(START_BUTTON) == 0) || (common_data.unk_10A68 != 0)) || ((((chkTrigger(R_TRIG) != 0) && (common_data.unk_10140 == 1)) == 1) && (common_data.unk_10A68 == 0))) && ((submenu->unk_E2 == 0) && (submenu->unk_E3 <= 0) && (mPlib_able_submenu_type1(game_play) != 0) && (mEv_CheckFirstIntro() == 0))) { if (chkTrigger(START_BUTTON) != 0) { mSM_open_submenu(submenu, 1, 0, 0); } else { mSM_open_submenu(submenu, 5, 1, 0); } mSM_Reset_player_btn_type2(game_play); } else { Player* player = get_player_actor_withoutCheck(game_play); UNUSED s32 pad; if ((player != NULL) && (player->unk_12B8 == 1) && (common_data.unk_10A68 == 0) && (submenu->unk_E2 == 0) && (submenu->unk_E3 <= 0)) { if (mPlib_able_submenu_type1(game_play) != 0) { if (ABS(BINANG_ROT180(player->actor.shape.rot.y)) < 0x2000) { switch (player->unk_12C0) { case 0x7: case 0xB: mSM_open_submenu(submenu, 6, 0, 0); mSM_Reset_player_btn_type1(game_play); break; case 0xC: case 0xD: mSM_open_submenu(submenu, 5, 0, 0); mSM_Reset_player_btn_type1(game_play); break; case 0xE: case 0xF: mSM_open_submenu(submenu, 8, 0, 0); mSM_Reset_player_btn_type1(game_play); break; } } } } } if (submenu->programId != SUBMENU_PROGRAM_0) { submenu->moveProcIndex = MSM_MOVE_PROC_PREWAIT; submenu->unk_00 = 1; SetGameFrame(2); } } void mSM_move_Wait(Submenu* submenu) { if (submenu->unk_20 != 0) { submenu->unk_20--; } if (submenu->unk_E3 > 0) { submenu->unk_E3--; } } void mSM_move_PREWait(Submenu* submenu) { if (submenu->unk_00 > 2) { submenu->moveProcIndex = MSM_MOVE_PROC_LINKWAIT; } } void mSM_move_LINKWait(Submenu* submenu) { SubmenuArea* submenuOvl = &SubmenuArea_dlftbl[SUBMENU_AREA_INDEX_SUBMENU]; if (SubmenuArea_visit == submenuOvl) { return; } if (SubmenuArea_visit != NULL) { SubmenuArea_DoUnlink(SubmenuArea_visit, submenu); } SubmenuArea_DoLink(submenuOvl, submenu, SUBMENU_AREA_INDEX_SUBMENU); submenu->move = mSM_ovlptr_dllcnv(mSM_menu_ovl_init, submenu); submenu->draw = (void*)none_proc1; submenu->moveProcIndex = MSM_MOVE_PROC_PLAY; submenu->unk_DC = 1; submenu->unk_E0 = 0; submenu->unk_DF = 0xF; submenu->unk_DD = 7; submenu->unk_DE = 0; mMl_clear_mail(&submenu->mail); xyz_t_move(&submenu->unk_E4, &ZeroVec); if (submenu->unk_00 != 4) { if (((submenu->programId == SUBMENU_PROGRAM_LEDIT) && (submenu->unk_10 == 0)) || (common_data.privateInfo->gender == 0)) { sAdo_SpecChange(5); } else { sAdo_SpecChange(6); } sAdo_SetVoiceMode(0); } } void mSM_move_Play(Submenu* submenu) { submenu->move(submenu); } #ifdef NON_MATCHING // likely branch instead of normal branch void mSM_move_End(Submenu* submenu) { UNUSED s32 pad; Game_Play* sp28; UNK_PTR sp24; UNUSED s32 sp20[1]; sp28 = (Game_Play*)gamePT; submenu->move(submenu); submenu->moveProcIndex = MSM_MOVE_PROC_WAIT; submenu->programId = SUBMENU_PROGRAM_0; submenu->unk_20 = 2; submenu->unk_DC = 0; SetGameFrame(2); if (submenu->unk_00 == 4) { return; } sp24 = mMsg_Get_base_window_p(); submenu->unk_00 = 0; mSc_dmacopy_all_exchange_bank(&sp28->objectExchangeBank); SubmenuArea_DoUnlink(SubmenuArea_dlftbl, submenu); load_player(submenu); mSM_load_player_anime(sp28); submenu->unk_E3 = 1; sp20[0] = 0; if (mMsg_Check_main_hide(sp24) != 0) { return; } if (mMsg_Check_not_series_main_wait(sp24) == 0) { return; } mMsg_sound_spec_change_voice(sp24); } #else void mSM_move_End(Submenu* submenu); #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_move_End.s") #endif typedef void (*MoveProcFunc)(Submenu*); MoveProcFunc move_proc_616[MSM_MOVE_PROC_MAX] = { mSM_move_Wait, // MSM_MOVE_PROC_WAIT mSM_move_PREWait, // MSM_MOVE_PROC_PREWAIT mSM_move_LINKWait, // MSM_MOVE_PROC_LINKWAIT mSM_move_Play, // MSM_MOVE_PROC_PLAY mSM_move_End, // MSM_MOVE_PROC_END }; void mSM_submenu_move(Submenu* submenu) { move_proc_616[submenu->moveProcIndex](submenu); } void mSM_submenu_draw(Submenu* submenu, struct Game_Play* game_play) { SubmenuArea* submenuOvl = &SubmenuArea_dlftbl[SUBMENU_AREA_INDEX_SUBMENU]; if ((submenu->unk_00 >= 3) && (submenu->moveProcIndex == 3) && (submenuOvl == SubmenuArea_visit)) { submenu->draw(submenu, game_play); } } s32 mSM_check_item_for_furniture(s32 index, UNUSED s32 arg1) { u16 temp_v0 = common_data.privateInfo->inventory.pockets[index]; if (((temp_v0 & 0xF000) >> 0xC) == 2) { if ((((temp_v0 & 0xF00) >> 8) != 3) && (((temp_v0 & 0xF00) >> 8) != 0xF) && (((temp_v0 & 0xF00) >> 8) != 0xD)) { if (!((common_data.privateInfo->inventory.item_conditions >> (index << 1)) & 3)) { if (temp_v0 != 0) { return true; } } } } return false; } s32 mSM_check_item_for_sell(s32 index, UNUSED s32 arg1) { u16 temp_v0 = common_data.privateInfo->inventory.pockets[index]; PrivateInfo* private = common_data.privateInfo; if (!((private->inventory.item_conditions >> (index << 1)) & 3)) { if (temp_v0 != 0) { if ((((temp_v0 & 0xF000) >> 0xC) != 2) || (((temp_v0 & 0xF00) >> 8) != 1)) { return true; } } } return false; } s32 mSM_check_item_for_give(s32 index, UNUSED s32 arg1) { PrivateInfo* private = common_data.privateInfo; if (!((private->inventory.item_conditions >> (index << 1)) & 3)) { if (private->inventory.pockets[index] != 0) { return true; } } return false; } s32 mSM_check_item_for_take(s32 index, s32 arg1) { u16 temp_v0 = common_data.privateInfo->inventory.pockets[index]; PrivateInfo* private = common_data.privateInfo; if (temp_v0 != 0) { if (!((private->inventory.item_conditions >> (index << 1)) & 3)) { if ((arg1 == 0) || ((((temp_v0 & 0xF000) >> 0xC) == 2) && ((((((temp_v0 & 0xF00) >> 8) == 3)) && (arg1 == 1)) || ((((temp_v0 & 0xF00) >> 8) == 0xD) && (arg1 == 2))))) { return true; } } } return false; } s32 mSM_check_item_for_minidisk(s32 index, UNUSED s32 arg1) { u16 temp_v0 = common_data.privateInfo->inventory.pockets[index]; PrivateInfo* private = common_data.privateInfo; if (((temp_v0 & 0xF000) >> 0xC) == 2) { if (!((private->inventory.item_conditions >> (index << 1)) & 3)) { if (((temp_v0 & 0xF00) >> 8) == 0xA) { return true; } } } return false; } s32 mSM_check_item_for_shrine(s32 index, UNUSED s32 arg1) { if (((common_data.privateInfo->inventory.item_conditions >> (index * 2)) & 3) == 2) { if (mQst_CheckLimitbyPossessionIdx(index) != 0) { return true; } } return false; } s32 mSM_check_item_for_entrust(s32 index, UNUSED s32 arg1) { u16 temp_v0 = common_data.privateInfo->inventory.pockets[index]; PrivateInfo* temp_v1 = common_data.privateInfo; if ((temp_v0 == 0) || (!((temp_v1->inventory.item_conditions >> (index << 1)) & 3) && ((((temp_v0 & 0xF000) >> 0xC) != 2) || (((temp_v0 & 0xF00) >> 8) != 1)))) { return true; } return false; } s32 mSM_check_item_for_exchange(s32 index, s32 arg1) { PrivateInfo* temp_v0 = common_data.privateInfo; u16 temp_v1 = temp_v0->inventory.pockets[index]; UNUSED s32 pad; if (!((temp_v0->inventory.item_conditions >> (index << 1)) & 3) && (temp_v1 != 0)) { if ((((temp_v1 & 0xF000) >> 0xC) == 2) && (((temp_v1 & 0xF00) >> 8) == 3) && ((((arg1 & 0xF000) >> 0xC) != 2) || (((arg1 & 0xF00) >> 8) != 3))) { Player* player = get_player_actor_withoutCheck((Game_Play*)gamePT); UNK_TYPE sp2C; if (mCoBG_SearchWaterLimitDistN(&sp2C, player->actor.world.pos, player->actor.shape.rot.y, 100.0f, 0xA) == 0) { return false; } } return true; } return false; } typedef s32 (*checkProcessFunc)(s32, s32); checkProcessFunc check_process[INVENTORY_ITEM_LIST_MAX] = { NULL, // INVENTORY_ITEM_LIST_0 NULL, // INVENTORY_ITEM_LIST_1 mSM_check_item_for_entrust, // INVENTORY_ITEM_LIST_ENTRUST NULL, // INVENTORY_ITEM_LIST_3 NULL, // INVENTORY_ITEM_LIST_4 mSM_check_item_for_sell, // INVENTORY_ITEM_LIST_SELL mSM_check_item_for_give, // INVENTORY_ITEM_LIST_GIVE NULL, // INVENTORY_ITEM_LIST_7 mSM_check_item_for_take, // INVENTORY_ITEM_LIST_TAKE mSM_check_item_for_furniture, // INVENTORY_ITEM_LIST_FURNITURE mSM_check_item_for_minidisk, // INVENTORY_ITEM_LIST_MINIDISK mSM_check_item_for_shrine, // INVENTORY_ITEM_LIST_SHRINE NULL, // INVENTORY_ITEM_LIST_C mSM_check_item_for_exchange, // INVENTORY_ITEM_LIST_ECHANGE NULL, // INVENTORY_ITEM_LIST_E NULL, // INVENTORY_ITEM_LIST_F }; u32 mSM_check_open_inventory_itemlist(InventoryItemList itemlist, s32 arg1) { checkProcessFunc func = check_process[itemlist]; s32 index; u32 ret; if (func == NULL) { return 0xFFFF; } ret = 0; for (index = 0; index < mPr_POCKETS_SLOT_COUNT; index++) { if (func(index, arg1)) { ret |= 1 << index; } } return ret; } #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_Object_Exchange_keep_new.s") #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_Object_Exchange_keep_new_MenuTexAndPallet.s") #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_Object_Exchange_keep_new_Menu.s") #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_Get_ground_tex_p.s") #pragma GLOBAL_ASM("asm/jp/nonmatchings/code/m_submenu/mSM_Get_ground_pallet_p.s")