diff --git a/asm/code_8046CE4.s b/asm/code_8046CE4.s index b8ff1f9f4..713c3a3dd 100644 --- a/asm/code_8046CE4.s +++ b/asm/code_8046CE4.s @@ -5,582 +5,6 @@ .text - thumb_func_start sub_8046CE4 -sub_8046CE4: - push {r4,r5,lr} - adds r4, r0, 0 - adds r5, r1, 0 - movs r0, 0x64 - bl DungeonRandomCapped - adds r1, r0, 0 - movs r2, 0 - ldr r3, _08046D04 -_08046CF6: - lsls r0, r1, 2 - adds r0, r3 - ldr r0, [r0] - cmp r0, r5 - bgt _08046D08 - strb r1, [r4, 0x1] - b _08046D18 - .align 2, 0 -_08046D04: .4byte gUnknown_810A3F0 -_08046D08: - lsrs r0, r1, 31 - adds r0, r1, r0 - asrs r1, r0, 1 - adds r2, 0x1 - cmp r2, 0xC7 - ble _08046CF6 - movs r0, 0x1 - strb r0, [r4, 0x1] -_08046D18: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8046CE4 - - thumb_func_start sub_8046D20 -sub_8046D20: - push {r4,r5,lr} - ldr r4, _08046D5C - ldr r0, [r4] - ldrb r5, [r0, 0x8] - bl sub_8046D70 - ldr r1, [r4] - strb r0, [r1, 0x8] - ldr r0, [r4] - ldrb r0, [r0, 0x8] - cmp r0, 0x1 - bne _08046D64 - cmp r5, 0 - bne _08046D64 - ldr r0, _08046D60 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl sub_8052B8C - adds r1, r0, 0 - cmp r1, 0x1 - bne _08046D64 - ldr r0, [r4] - strb r1, [r0, 0x4] - ldr r1, [r4] - movs r0, 0x2 - strb r0, [r1, 0x11] - b _08046D68 - .align 2, 0 -_08046D5C: .4byte gDungeonGlobalData -_08046D60: .4byte gUnknown_80FA408 -_08046D64: - bl sub_8046D8C -_08046D68: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_8046D20 - - thumb_func_start sub_8046D70 -sub_8046D70: - push {lr} - ldr r0, _08046D84 - ldr r0, [r0] - ldr r1, _08046D88 - adds r0, r1 - ldrb r0, [r0] - movs r0, 0 - pop {r1} - bx r1 - .align 2, 0 -_08046D84: .4byte gDungeonGlobalData -_08046D88: .4byte 0x0000068a - thumb_func_end sub_8046D70 - - thumb_func_start sub_8046D8C -sub_8046D8C: - push {r4-r7,lr} - sub sp, 0xC - movs r6, 0 - ldr r5, _08046EDC - movs r4, 0 -_08046D96: - movs r7, 0 - movs r0, 0x1 - negs r0, r0 - str r0, [sp] - str r0, [sp, 0x4] - str r0, [sp, 0x8] - movs r3, 0 - ldr r2, [r5] -_08046DA6: - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08046DC8 - ldrb r0, [r2, 0x2] - cmp r0, 0x79 - bne _08046DB8 - str r3, [sp] -_08046DB8: - ldrb r0, [r2, 0x2] - cmp r0, 0x77 - bne _08046DC0 - str r3, [sp, 0x4] -_08046DC0: - ldrb r0, [r2, 0x2] - cmp r0, 0x78 - bne _08046DC8 - str r3, [sp, 0x8] -_08046DC8: - adds r2, 0x4 - adds r3, 0x1 - cmp r3, 0x13 - ble _08046DA6 - ldr r1, [sp] - cmp r1, 0 - blt _08046E1E - ldr r0, [sp, 0x4] - cmp r0, 0 - blt _08046E1E - ldr r0, [sp, 0x8] - cmp r0, 0 - blt _08046E1E - movs r7, 0x1 - movs r6, 0x1 - lsls r1, 2 - ldr r0, [r5] - adds r1, r0 - strb r4, [r1, 0x2] - strb r4, [r1, 0x1] - strb r4, [r1] - ldr r0, [sp, 0x4] - lsls r0, 2 - ldr r1, [r5] - adds r0, r1 - strb r4, [r0, 0x2] - strb r4, [r0, 0x1] - strb r4, [r0] - ldr r0, [sp, 0x8] - lsls r0, 2 - ldr r1, [r5] - adds r0, r1 - strb r4, [r0, 0x2] - strb r4, [r0, 0x1] - strb r4, [r0] - ldr r1, [sp] - lsls r1, 2 - ldr r0, [r5] - adds r0, r1 - movs r1, 0x7A - movs r2, 0 - bl xxx_init_itemslot_8090A8C -_08046E1E: - cmp r7, 0 - bne _08046D96 - bl FillInventoryGaps - cmp r6, 0 - beq _08046ED4 - bl GetLeaderEntity - adds r4, r0, 0 - ldr r0, _08046EE0 - bl sub_80855E4 - ldr r6, _08046EE4 - ldr r0, [r6] - ldr r5, _08046EE8 - adds r0, r5 - movs r1, 0x1 - strb r1, [r0] - ldr r0, _08046EEC - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage - movs r0, 0x3C - movs r1, 0x41 - bl sub_803E708 - ldr r0, _08046EF0 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage - adds r0, r4, 0 - movs r1, 0x4 - movs r2, 0xA - movs r3, 0 - bl sub_80869E4 - adds r0, r4, 0 - adds r0, 0xC - movs r1, 0x86 - lsls r1, 1 - movs r2, 0 - bl sub_80416E0 - adds r0, r4, 0 - movs r1, 0xD7 - bl sub_80421C0 - movs r0, 0x3C - movs r1, 0x41 - bl sub_803E708 - ldr r0, _08046EF4 - adds r1, r4, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _08046EF8 - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage - movs r0, 0xA - movs r1, 0x41 - bl sub_803E708 - movs r0, 0xD4 - bl PlaySoundEffect - ldr r0, _08046EFC - ldr r1, [r0] - movs r0, 0 - movs r2, 0x1 - bl PrintFieldMessage - movs r0, 0xA - movs r1, 0x41 - bl sub_803E708 - movs r0, 0x1 - bl sub_804178C - ldr r0, [r6] - adds r0, r5 - strb r7, [r0] - bl sub_8040A84 -_08046ED4: - add sp, 0xC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08046EDC: .4byte gTeamInventory_203B460 -_08046EE0: .4byte sub_80861A8 -_08046EE4: .4byte gDungeonGlobalData -_08046EE8: .4byte 0x0001356c -_08046EEC: .4byte gUnknown_810531C -_08046EF0: .4byte gUnknown_8105360 -_08046EF4: .4byte gAvailablePokemonNames -_08046EF8: .4byte gUnknown_81053A8 -_08046EFC: .4byte gUnknown_8105434 - thumb_func_end sub_8046D8C - - thumb_func_start sub_8046F00 -sub_8046F00: - push {r4-r7,lr} - adds r4, r0, 0 - ldrb r0, [r4, 0x2] - bl GetItemType - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x5 - bne _08046F7C - ldrb r0, [r4, 0x2] - bl GetItemMove - lsls r0, 16 - lsrs r7, r0, 16 - ldrb r0, [r4, 0x2] - bl IsHMItem - lsls r0, 24 - cmp r0, 0 - bne _08046F6E - movs r6, 0 -_08046F2A: - ldr r0, _08046F74 - ldr r0, [r0] - lsls r1, r6, 2 - ldr r2, _08046F78 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08046F68 - ldr r0, [r4, 0x70] - movs r2, 0x2 - ldrsh r1, [r0, r2] - adds r0, r7, 0 - bl CanMonLearnMove - lsls r0, 24 - lsrs r5, r0, 24 - adds r0, r4, 0 - movs r1, 0 - bl CannotMove - lsls r0, 24 - cmp r0, 0 - beq _08046F64 - movs r5, 0 -_08046F64: - cmp r5, 0 - bne _08046F7C -_08046F68: - adds r6, 0x1 - cmp r6, 0x3 - ble _08046F2A -_08046F6E: - movs r0, 0 - b _08046F7E - .align 2, 0 -_08046F74: .4byte gDungeonGlobalData -_08046F78: .4byte 0x0001357c -_08046F7C: - movs r0, 0x1 -_08046F7E: - pop {r4-r7} - pop {r1} - bx r1 - thumb_func_end sub_8046F00 - - thumb_func_start sub_8046F84 -sub_8046F84: - push {r4-r7,lr} - adds r7, r0, 0 - movs r5, 0 - ldr r4, _08047000 - movs r6, 0x1 - movs r3, 0 -_08046F90: - lsls r1, r5, 2 - ldr r0, [r4] - adds r2, r0, r1 - ldrb r1, [r2] - adds r0, r6, 0 - ands r0, r1 - cmp r0, 0 - beq _08046FAE - ldrb r0, [r2] - ands r0, r7 - cmp r0, 0 - beq _08046FAE - strb r3, [r2, 0x2] - strb r3, [r2, 0x1] - strb r3, [r2] -_08046FAE: - adds r5, 0x1 - cmp r5, 0x13 - ble _08046F90 - bl FillInventoryGaps - movs r5, 0 - movs r6, 0 -_08046FBC: - ldr r0, _08047004 - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08047008 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _08046FF4 - ldr r0, [r4, 0x70] - adds r2, r0, 0 - adds r2, 0x60 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08046FF4 - ldrb r0, [r2] - ands r0, r7 - cmp r0, 0 - beq _08046FF4 - strb r6, [r2, 0x2] - strb r6, [r2, 0x1] - strb r6, [r2] -_08046FF4: - adds r5, 0x1 - cmp r5, 0x3 - ble _08046FBC - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08047000: .4byte gTeamInventory_203B460 -_08047004: .4byte gDungeonGlobalData -_08047008: .4byte 0x0001357c - thumb_func_end sub_8046F84 - - thumb_func_start sub_804700C -sub_804700C: - push {r4,r5,lr} - movs r5, 0 - ldr r4, _08047078 -_08047012: - lsls r1, r5, 2 - ldr r0, [r4] - adds r2, r0, r1 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0804702C - adds r0, r2, 0 - movs r1, 0x46 - movs r2, 0 - bl xxx_init_itemslot_8090A8C -_0804702C: - adds r5, 0x1 - cmp r5, 0x13 - ble _08047012 - bl FillInventoryGaps - movs r5, 0 -_08047038: - ldr r0, _0804707C - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _08047080 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0804706C - ldr r0, [r4, 0x70] - adds r2, r0, 0 - adds r2, 0x60 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _0804706C - adds r0, r2, 0 - movs r1, 0x46 - movs r2, 0 - bl xxx_init_itemslot_8090A8C -_0804706C: - adds r5, 0x1 - cmp r5, 0x3 - ble _08047038 - pop {r4,r5} - pop {r0} - bx r0 - .align 2, 0 -_08047078: .4byte gTeamInventory_203B460 -_0804707C: .4byte gDungeonGlobalData -_08047080: .4byte 0x0001357c - thumb_func_end sub_804700C - - thumb_func_start sub_8047084 -sub_8047084: - push {r4-r6,lr} - adds r6, r0, 0 - movs r5, 0 - ldr r0, _080470E8 - ldr r2, [r0] - movs r3, 0x1 -_08047090: - ldrb r1, [r2] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - beq _080470A2 - ldrb r0, [r2] - ands r0, r6 - cmp r0, 0 - bne _080470E2 -_080470A2: - adds r2, 0x4 - adds r5, 0x1 - cmp r5, 0x13 - ble _08047090 - bl FillInventoryGaps - movs r5, 0 -_080470B0: - ldr r0, _080470EC - ldr r0, [r0] - lsls r1, r5, 2 - ldr r2, _080470F0 - adds r0, r2 - adds r0, r1 - ldr r4, [r0] - adds r0, r4, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _080470F4 - ldr r0, [r4, 0x70] - adds r2, r0, 0 - adds r2, 0x60 - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _080470F4 - ldrb r0, [r2] - ands r0, r6 - cmp r0, 0 - beq _080470F4 -_080470E2: - movs r0, 0x1 - b _080470FC - .align 2, 0 -_080470E8: .4byte gTeamInventory_203B460 -_080470EC: .4byte gDungeonGlobalData -_080470F0: .4byte 0x0001357c -_080470F4: - adds r5, 0x1 - cmp r5, 0x3 - ble _080470B0 - movs r0, 0 -_080470FC: - pop {r4-r6} - pop {r1} - bx r1 - thumb_func_end sub_8047084 - - thumb_func_start sub_8047104 -sub_8047104: - push {r4-r6,lr} - movs r6, 0 - movs r5, 0 -_0804710A: - ldr r0, _08047154 - lsls r1, r6, 2 - ldr r0, [r0] - adds r4, r0, r1 - ldrb r1, [r4] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08047142 - ldrb r0, [r4, 0x2] - cmp r0, 0x69 - bne _08047132 - adds r0, r4, 0 - bl GetMoneyValue - bl AddToTeamMoney - strb r5, [r4, 0x2] - strb r5, [r4, 0x1] - strb r5, [r4] -_08047132: - ldrb r1, [r4] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08047142 - strb r5, [r4, 0x2] - strb r5, [r4, 0x1] - strb r5, [r4] -_08047142: - adds r6, 0x1 - cmp r6, 0x13 - ble _0804710A - bl FillInventoryGaps - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08047154: .4byte gTeamInventory_203B460 - thumb_func_end sub_8047104 - thumb_func_start sub_8047158 sub_8047158: push {r4-r6,lr} diff --git a/include/dungeon_global_data.h b/include/dungeon_global_data.h index 3a6c2b6c7..9f95b773e 100644 --- a/include/dungeon_global_data.h +++ b/include/dungeon_global_data.h @@ -30,7 +30,8 @@ struct DungeonGlobalData u8 unk4; u8 fill5[0x7 - 0x5]; u8 unk7; - u8 fill8[0xF - 0x8]; + u8 unk8; + u8 fill9[0xF - 0x9]; /* 0xF */ bool8 inputAllowed; // Whether the game is currently accepting input. Set to false while action animations play. u8 fill10; u8 unk11; @@ -53,7 +54,9 @@ struct DungeonGlobalData u8 fill66C[0x671 - 0x66C]; /* 0x671 */ bool8 monsterHouseActive; /* 0x672 */ u8 unk672; - u8 fill673[0x363C - 0x673]; + u8 fill673[0x68A - 0x673]; + /* 0x68A */ u8 unk68A; + u8 fill68B[0x363C - 0x68B]; /* 0x363C */ u8 expYieldRankings[NUM_SPECIES]; u8 fill37E3[0x37FC - 0x37D9]; /* 0x37FC */ bool8 decoyActive; diff --git a/include/item.h b/include/item.h index 6ac68478f..d9a9de60c 100644 --- a/include/item.h +++ b/include/item.h @@ -117,6 +117,7 @@ void FillInventoryGaps(); bool8 AddHeldItemToInventory(struct HeldItem* slot); bool8 IsNotMoneyOrUsedTMItem(u8 id); s32 FindItemInInventory(u8 itemIndex); +bool8 IsHMItem(u8 id); void RestoreHeldItem(struct unkStruct_8094924*, struct HeldItem*); diff --git a/include/pokemon.h b/include/pokemon.h index 193229c5f..c3135b7ca 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -193,6 +193,7 @@ void PrintColoredPokeNameToBuffer(u8 *buffer, struct PokemonStruct *pokemon, s32 void PeekPokemonItem(s16 index_, struct HeldItem* item); void GivePokemonItem(s16 index_, struct HeldItem* item); bool8 IsPokemonRenamed(struct PokemonStruct* pokemon); +bool8 CanMonLearnMove(u16 moveID, s16 _species); u8 *GetCategoryString(s16 index); u8 GetPokemonSize(s16 index); diff --git a/src/dungeon_items.c b/src/dungeon_items.c index bfaab5368..7e8366857 100644 --- a/src/dungeon_items.c +++ b/src/dungeon_items.c @@ -1,6 +1,38 @@ #include "global.h" #include "dungeon_items.h" +#include "dungeon_capabilities.h" +#include "dungeon_random.h" +#include "dungeon_global_data.h" +#include "dungeon_util.h" +#include "team_inventory.h" +#include "pokemon.h" + +extern u8 gAvailablePokemonNames[]; +extern s32 gUnknown_810A3F0[]; +extern u8 *gUnknown_80FA408[]; +extern u8 *gUnknown_810531C[]; +extern u8 *gUnknown_8105360[]; +extern u8 *gUnknown_81053A8[]; +extern u8 *gUnknown_8105434[]; + +extern u8 sub_8046D70(void); +extern s32 sub_8052B8C(u32, u8 *, u32); +extern struct DungeonEntity *GetLeaderEntity(void); +extern void sub_80861A8(void); +extern void PrintFieldMessage(u32, u8 *, u32); +extern void sub_803E708(u32, u32); +extern void sub_80869E4(struct DungeonEntity *, u32, u32, u32); +extern void sub_80416E0(struct Position32 *r0, u32, u32); +extern void SetMessageArgument(u8 *r0, struct DungeonEntity *r1, u32); +extern void sub_80421C0(struct DungeonEntity *, u32); +extern void sub_80855E4(void *); +extern void PlaySoundEffect(u32); +extern void sub_804178C(u32); +extern void sub_8040A84(void); + +void MusicBoxCreation(void); + bool8 HasItem(struct DungeonEntity *pokemon, u8 itemIndex) { // Weird assignment to fix a regswap. @@ -19,3 +51,459 @@ bool8 HasItem(struct DungeonEntity *pokemon, u8 itemIndex) } return TRUE; } + +void sub_8046CE4(u8 *param_1,s32 param_2) +{ + s32 iVar1; + s32 iVar2; + + iVar1 = DungeonRandomCapped(100); + for(iVar2 = 0; iVar2 < 200; iVar2++) + { + if (gUnknown_810A3F0[iVar1] <= param_2) { + param_1[1] = iVar1; + return; + } + iVar1 = iVar1 / 2; + } + param_1[1] = 1; +} + +void sub_8046D20(void) +{ + u8 cVar1; + + cVar1 = gDungeonGlobalData->unk8; + gDungeonGlobalData->unk8 = sub_8046D70(); + if (((gDungeonGlobalData->unk8 == 1) && (cVar1 == 0)) && + (sub_8052B8C(0, *gUnknown_80FA408, 1) == 1)) { + gDungeonGlobalData->unk4 = 1; + gDungeonGlobalData->unk11 = 2; + } + else { + MusicBoxCreation(); + } +} + +u8 sub_8046D70(void) +{ + if(gDungeonGlobalData->unk68A) + return 0; + else + return 0; +} + +#ifdef NONMATCHING +void MusicBoxCreation(void) +{ + bool8 musicBoxOnce; + bool8 createMusicBox; + struct ItemSlot *pbVar3; // r2 + s32 iVar4; + struct DungeonEntity *entity; + + s32 indexes[3]; + + createMusicBox = FALSE; + do { + musicBoxOnce = FALSE; + indexes[0] = -1; + indexes[1] = -1; + indexes[2] = -1; + + for(iVar4 = 0, pbVar3 = &gTeamInventory_203B460->teamItems[iVar4]; iVar4 < 20; pbVar3++, iVar4++) + { + if (pbVar3->itemFlags & ITEM_FLAG_EXISTS) { + if (pbVar3->itemIndex == ITEM_ID_ROCK_PART) { + indexes[0] = iVar4; + } + if (pbVar3->itemIndex == ITEM_ID_ICE_PART) { + indexes[1] = iVar4; + } + if (pbVar3->itemIndex == ITEM_ID_STEEL_PART) { + indexes[2] = iVar4; + } + } + } + + if ((indexes[0] >= 0) && (indexes[1] >= 0) && (indexes[2] >= 0)) { + + // NOTE: doesn't match here.. tried to register pin but still not perfect + register struct ItemSlot *pbVar4 asm("r1"); + register struct ItemSlot *pbVar5 asm("r0"); + + musicBoxOnce = TRUE; + createMusicBox = TRUE; + + // clear out each of the parts + pbVar4 = &gTeamInventory_203B460->teamItems[indexes[0]]; + pbVar4->itemIndex = 0; + pbVar4->numItems = 0; + pbVar4->itemFlags = 0; + + pbVar5 = &gTeamInventory_203B460->teamItems[indexes[1]]; + pbVar5->itemIndex = 0; + pbVar5->numItems = 0; + pbVar5->itemFlags = 0; + + pbVar5 = &gTeamInventory_203B460->teamItems[indexes[2]]; + pbVar5->itemIndex = 0; + pbVar5->numItems = 0; + pbVar5->itemFlags = 0; + + // init the music box + xxx_init_itemslot_8090A8C(&gTeamInventory_203B460->teamItems[indexes[0]], ITEM_ID_MUSIC_BOX, 0); + } + } while (musicBoxOnce); + + FillInventoryGaps(); + + if (createMusicBox) { + entity = GetLeaderEntity(); + sub_80855E4(sub_80861A8); + gDungeonGlobalData->unk1356C = 1; + PrintFieldMessage(0,*gUnknown_810531C,1); + sub_803E708(0x3c,0x41); + PrintFieldMessage(0,*gUnknown_8105360,1); + sub_80869E4(entity,4,10,0); + sub_80416E0(&entity->posPixel,0x10c,0); + sub_80421C0(entity,0xd7); + sub_803E708(0x3c,0x41); + SetMessageArgument(gAvailablePokemonNames,entity,0); + PrintFieldMessage(0,*gUnknown_81053A8,1); + sub_803E708(10,0x41); + PlaySoundEffect(0xd4); + PrintFieldMessage(0,*gUnknown_8105434,1); + sub_803E708(10,0x41); + sub_804178C(1); + gDungeonGlobalData->unk1356C = 0; + sub_8040A84(); + } +} +#else +NAKED +void MusicBoxCreation(void) +{ + asm_unified( + "\tpush {r4-r7,lr}\n" + "\tsub sp, 0xC\n" + "\tmovs r6, 0\n" + "\tldr r5, _08046EDC\n" + "\tmovs r4, 0\n" +"_08046D96:\n" + "\tmovs r7, 0\n" + "\tmovs r0, 0x1\n" + "\tnegs r0, r0\n" + "\tstr r0, [sp]\n" + "\tstr r0, [sp, 0x4]\n" + "\tstr r0, [sp, 0x8]\n" + "\tmovs r3, 0\n" + "\tldr r2, [r5]\n" +"_08046DA6:\n" + "\tldrb r1, [r2]\n" + "\tmovs r0, 0x1\n" + "\tands r0, r1\n" + "\tcmp r0, 0\n" + "\tbeq _08046DC8\n" + "\tldrb r0, [r2, 0x2]\n" + "\tcmp r0, 0x79\n" + "\tbne _08046DB8\n" + "\tstr r3, [sp]\n" +"_08046DB8:\n" + "\tldrb r0, [r2, 0x2]\n" + "\tcmp r0, 0x77\n" + "\tbne _08046DC0\n" + "\tstr r3, [sp, 0x4]\n" +"_08046DC0:\n" + "\tldrb r0, [r2, 0x2]\n" + "\tcmp r0, 0x78\n" + "\tbne _08046DC8\n" + "\tstr r3, [sp, 0x8]\n" +"_08046DC8:\n" + "\tadds r2, 0x4\n" + "\tadds r3, 0x1\n" + "\tcmp r3, 0x13\n" + "\tble _08046DA6\n" + "\tldr r1, [sp]\n" + "\tcmp r1, 0\n" + "\tblt _08046E1E\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r0, 0\n" + "\tblt _08046E1E\n" + "\tldr r0, [sp, 0x8]\n" + "\tcmp r0, 0\n" + "\tblt _08046E1E\n" + "\tmovs r7, 0x1\n" + "\tmovs r6, 0x1\n" + "\tlsls r1, 2\n" + "\tldr r0, [r5]\n" + "\tadds r1, r0\n" + "\tstrb r4, [r1, 0x2]\n" + "\tstrb r4, [r1, 0x1]\n" + "\tstrb r4, [r1]\n" + "\tldr r0, [sp, 0x4]\n" + "\tlsls r0, 2\n" + "\tldr r1, [r5]\n" + "\tadds r0, r1\n" + "\tstrb r4, [r0, 0x2]\n" + "\tstrb r4, [r0, 0x1]\n" + "\tstrb r4, [r0]\n" + "\tldr r0, [sp, 0x8]\n" + "\tlsls r0, 2\n" + "\tldr r1, [r5]\n" + "\tadds r0, r1\n" + "\tstrb r4, [r0, 0x2]\n" + "\tstrb r4, [r0, 0x1]\n" + "\tstrb r4, [r0]\n" + "\tldr r1, [sp]\n" + "\tlsls r1, 2\n" + "\tldr r0, [r5]\n" + "\tadds r0, r1\n" + "\tmovs r1, 0x7A\n" + "\tmovs r2, 0\n" + "\tbl xxx_init_itemslot_8090A8C\n" +"_08046E1E:\n" + "\tcmp r7, 0\n" + "\tbne _08046D96\n" + "\tbl FillInventoryGaps\n" + "\tcmp r6, 0\n" + "\tbeq _08046ED4\n" + "\tbl GetLeaderEntity\n" + "\tadds r4, r0, 0\n" + "\tldr r0, _08046EE0\n" + "\tbl sub_80855E4\n" + "\tldr r6, _08046EE4\n" + "\tldr r0, [r6]\n" + "\tldr r5, _08046EE8\n" + "\tadds r0, r5\n" + "\tmovs r1, 0x1\n" + "\tstrb r1, [r0]\n" + "\tldr r0, _08046EEC\n" + "\tldr r1, [r0]\n" + "\tmovs r0, 0\n" + "\tmovs r2, 0x1\n" + "\tbl PrintFieldMessage\n" + "\tmovs r0, 0x3C\n" + "\tmovs r1, 0x41\n" + "\tbl sub_803E708\n" + "\tldr r0, _08046EF0\n" + "\tldr r1, [r0]\n" + "\tmovs r0, 0\n" + "\tmovs r2, 0x1\n" + "\tbl PrintFieldMessage\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x4\n" + "\tmovs r2, 0xA\n" + "\tmovs r3, 0\n" + "\tbl sub_80869E4\n" + "\tadds r0, r4, 0\n" + "\tadds r0, 0xC\n" + "\tmovs r1, 0x86\n" + "\tlsls r1, 1\n" + "\tmovs r2, 0\n" + "\tbl sub_80416E0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xD7\n" + "\tbl sub_80421C0\n" + "\tmovs r0, 0x3C\n" + "\tmovs r1, 0x41\n" + "\tbl sub_803E708\n" + "\tldr r0, _08046EF4\n" + "\tadds r1, r4, 0\n" + "\tmovs r2, 0\n" + "\tbl SetMessageArgument\n" + "\tldr r0, _08046EF8\n" + "\tldr r1, [r0]\n" + "\tmovs r0, 0\n" + "\tmovs r2, 0x1\n" + "\tbl PrintFieldMessage\n" + "\tmovs r0, 0xA\n" + "\tmovs r1, 0x41\n" + "\tbl sub_803E708\n" + "\tmovs r0, 0xD4\n" + "\tbl PlaySoundEffect\n" + "\tldr r0, _08046EFC\n" + "\tldr r1, [r0]\n" + "\tmovs r0, 0\n" + "\tmovs r2, 0x1\n" + "\tbl PrintFieldMessage\n" + "\tmovs r0, 0xA\n" + "\tmovs r1, 0x41\n" + "\tbl sub_803E708\n" + "\tmovs r0, 0x1\n" + "\tbl sub_804178C\n" + "\tldr r0, [r6]\n" + "\tadds r0, r5\n" + "\tstrb r7, [r0]\n" + "\tbl sub_8040A84\n" +"_08046ED4:\n" + "\tadd sp, 0xC\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" +"_08046EDC: .4byte gTeamInventory_203B460\n" +"_08046EE0: .4byte sub_80861A8\n" +"_08046EE4: .4byte gDungeonGlobalData\n" +"_08046EE8: .4byte 0x0001356c\n" +"_08046EEC: .4byte gUnknown_810531C\n" +"_08046EF0: .4byte gUnknown_8105360\n" +"_08046EF4: .4byte gAvailablePokemonNames\n" +"_08046EF8: .4byte gUnknown_81053A8\n" +"_08046EFC: .4byte gUnknown_8105434" + ); +} +#endif + +bool8 sub_8046F00(struct ItemSlot *item) +{ + bool8 canLearnMove; + bool8 cannotMove; + u16 moveID; + struct DungeonEntity *entity; + s32 index; + + if (GetItemType(item->itemIndex) == ITEM_TYPE_TM) { + moveID = GetItemMove(item->itemIndex); + if (!IsHMItem(item->itemIndex)) { + for(index = 0; index < MAX_TEAM_MEMBERS; index++) + { + entity = gDungeonGlobalData->teamPokemon[index]; + if (EntityExists(entity)) { + canLearnMove = CanMonLearnMove(moveID, entity->entityData->entityID); + cannotMove = CannotMove(entity, FALSE); + if (cannotMove) { + canLearnMove = FALSE; + } + if (canLearnMove) return TRUE; + } + } + } + return FALSE; + } + else + return TRUE; +} + +void sub_8046F84(s32 itemFlag) +{ + struct ItemSlot *item; + struct DungeonEntity *entity; + struct DungeonEntityData *entityData; + s32 index; + + for(index = 0; index < INVENTORY_SIZE; index++) + { + item = &gTeamInventory_203B460->teamItems[index]; + if ((item->itemFlags & ITEM_FLAG_EXISTS) && (item->itemFlags & itemFlag)) { + item->itemIndex = 0; + item->numItems = 0; + item->itemFlags = 0; + } + } + FillInventoryGaps(); + + for(index = 0; index < 4; index++) + { + entity = gDungeonGlobalData->teamPokemon[index]; + if (EntityExists(entity)) { + entityData = entity->entityData; + item = &entityData->heldItem; + if ((item->itemFlags & ITEM_FLAG_EXISTS) && (item->itemFlags & itemFlag)) { + item->itemIndex = 0; + item->numItems = 0; + item->itemFlags = 0; + } + } + } +} + +void sub_804700C(void) +{ + struct ItemSlot *item; + struct DungeonEntity *entity; + struct DungeonEntityData *entityData; + s32 index; + + for(index = 0; index < INVENTORY_SIZE; index++) + { + item = &gTeamInventory_203B460->teamItems[index]; + if ((item->itemFlags & ITEM_FLAG_EXISTS)) { + xxx_init_itemslot_8090A8C(item, ITEM_ID_PLAIN_SEED, 0); + } + } + FillInventoryGaps(); + + for(index = 0; index < MAX_TEAM_MEMBERS; index++) + { + entity = gDungeonGlobalData->teamPokemon[index]; + if (EntityExists(entity)) { + entityData = entity->entityData; + item = &entityData->heldItem; + if ((item->itemFlags & ITEM_FLAG_EXISTS)) { + xxx_init_itemslot_8090A8C(item, ITEM_ID_PLAIN_SEED, 0); + } + } + } +} + +bool8 sub_8047084(s32 itemFlag) +{ + struct ItemSlot *item; + struct DungeonEntity *entity; + struct DungeonEntityData *entityData; + s32 index; + + // NEED THIS ORDERING TO MATCH + index = 0; + item = &gTeamInventory_203B460->teamItems[index]; + + for(index = 0; index < INVENTORY_SIZE; item++, index++) + { + if ((item->itemFlags & ITEM_FLAG_EXISTS) && (item->itemFlags & itemFlag)) { + return TRUE; + } + } + FillInventoryGaps(); + + for(index = 0; index < MAX_TEAM_MEMBERS; index++) + { + entity = gDungeonGlobalData->teamPokemon[index]; + if (EntityExists(entity)) { + entityData = entity->entityData; + item = &entityData->heldItem; + if ((item->itemFlags & ITEM_FLAG_EXISTS) && (item->itemFlags & itemFlag)) { + return TRUE; + } + } + } + return FALSE; +} + +void sub_8047104(void) +{ + struct ItemSlot *item; + s32 index; + + for(index = 0; index < INVENTORY_SIZE; index++) + { + item = &gTeamInventory_203B460->teamItems[index]; + if (item->itemFlags & ITEM_FLAG_EXISTS) + { + if(item->itemIndex == ITEM_ID_POKE) + { + AddToTeamMoney(GetMoneyValue(item)); + item->itemIndex = 0; + item->numItems = 0; + item->itemFlags = 0; + } + if(item->itemFlags & ITEM_FLAG_FOR_SALE) + { + item->itemIndex = 0; + item->numItems = 0; + item->itemFlags = 0; + } + } + } + FillInventoryGaps(); +}