diff --git a/asm/code_8073CF0.s b/asm/code_8073CF0.s index cdd251e46..53400a431 100644 --- a/asm/code_8073CF0.s +++ b/asm/code_8073CF0.s @@ -5,451 +5,6 @@ .text - thumb_func_start sub_8073D14 -sub_8073D14: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0xB0 - adds r6, r0, 0 - ldr r4, [r6, 0x70] - bl GetTileAtEntitySafe - ldr r5, [r0, 0x14] - cmp r5, 0 - bne _08073D30 - b _0807407A -_08073D30: - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - beq _08073D3C - b _0807407A -_08073D3C: - ldr r0, _08073D68 - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - ldrb r0, [r4, 0x7] - cmp r0, 0 - beq _08073D4E - b _0807407A -_08073D4E: - ldrb r0, [r4, 0x8] - cmp r0, 0x1 - bne _08073D56 - b _0807407A -_08073D56: - adds r0, r4, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _08073D64 - cmp r0, 0x47 - bne _08073D6C -_08073D64: - movs r0, 0x1 - b _08073D6E - .align 2, 0 -_08073D68: .4byte gAvailablePokemonNames -_08073D6C: - movs r0, 0 -_08073D6E: - cmp r0, 0 - beq _08073D74 - b _0807407A -_08073D74: - adds r0, r4, 0 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - bne _08073D80 - b _0807407A -_08073D80: - ldr r0, [r6, 0x70] - mov r10, r0 - adds r0, r5, 0 - bl GetItemData - adds r5, r0, 0 - ldrb r1, [r5] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08073D98 - b _0807407A -_08073D98: - adds r0, r6, 0 - movs r1, 0x1 - bl ShouldMonsterRunAwayAndShowEffect - lsls r0, 24 - cmp r0, 0 - beq _08073DC8 - ldr r0, _08073DBC - adds r1, r5, 0 - bl sub_8045BF8 - ldr r0, _08073DC0 - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _08073DC4 - b _0807404C - .align 2, 0 -_08073DBC: .4byte gUnknown_202DE58 -_08073DC0: .4byte gAvailablePokemonNames -_08073DC4: .4byte gUnknown_80F8F88 -_08073DC8: - mov r1, r10 - ldrb r0, [r1, 0x6] - cmp r0, 0 - bne _08073E24 - ldrb r0, [r5, 0x2] - bl GetItemCategory - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x6 - bne _08073E24 - mov r7, r10 - ldrb r0, [r7, 0x6] - cmp r0, 0 - beq _08073DF4 - ldr r0, _08073DF0 - bl PlaySoundEffect - b _08073DFC - .align 2, 0 -_08073DF0: .4byte 0x0000014b -_08073DF4: - movs r0, 0xA6 - lsls r0, 1 - bl PlaySoundEffect -_08073DFC: - adds r0, r5, 0 - bl GetMoneyValue - bl AddToTeamMoney - ldr r0, _08073E1C - adds r1, r5, 0 - bl sub_8045BF8 - adds r0, r6, 0x4 - movs r1, 0x1 - bl sub_80461C8 - ldr r0, _08073E20 - b _0807404C - .align 2, 0 -_08073E1C: .4byte gUnknown_202DE58 -_08073E20: .4byte gUnknown_80F9054 -_08073E24: - ldr r0, _08073E64 - ldr r0, [r0] - ldr r1, _08073E68 - adds r0, r1 - ldrb r0, [r0] - cmp r0, 0 - beq _08073E70 - mov r7, r10 - ldrb r0, [r7, 0x6] - cmp r0, 0 - bne _08073E70 - movs r4, 0 - add r2, sp, 0x54 - adds r7, 0x60 - ldr r0, _08073E6C - mov r1, sp - ldr r0, [r0] - adds r3, r2, 0 -_08073E48: - stm r3!, {r0} - stm r1!, {r4} - adds r0, 0x4 - adds r4, 0x1 - cmp r4, 0x13 - ble _08073E48 - str r7, [r2, 0x50] - movs r0, 0x1 - negs r0, r0 - str r0, [sp, 0x50] - movs r0, 0x15 - mov r8, r0 - b _08073E80 - .align 2, 0 -_08073E64: .4byte gDungeon -_08073E68: .4byte 0x0000065b -_08073E6C: .4byte gTeamInventoryRef -_08073E70: - mov r0, r10 - adds r0, 0x60 - str r0, [sp, 0x54] - movs r0, 0x1 - negs r0, r0 - str r0, [sp] - movs r1, 0x1 - mov r8, r1 -_08073E80: - ldrb r0, [r5, 0x2] - add r7, sp, 0xA8 - strb r0, [r7] - adds r0, r7, 0 - ldrb r0, [r0] - cmp r0, 0x8 - bls _08073E90 - b _08073FA8 -_08073E90: - ldrb r1, [r5] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _08073E9C - b _08073FA8 -_08073E9C: - movs r1, 0x1 - negs r1, r1 - mov r12, r1 - mov r7, r12 - str r7, [sp, 0xAC] - movs r4, 0 - cmp r4, r8 - bge _08073EEC - ldr r0, _08073F94 - mov r9, r0 - add r3, sp, 0x54 -_08073EB2: - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08073EE4 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08073EE4 - ldr r1, [r5] - mov r7, r9 - ands r1, r7 - ldr r0, [r2] - ands r0, r7 - cmp r1, r0 - bne _08073EE4 - ldrb r0, [r2, 0x1] - cmp r0, 0x63 - beq _08073EE4 - ldr r1, [sp, 0xAC] - cmp r1, r0 - bge _08073EE4 - str r0, [sp, 0xAC] - mov r12, r4 -_08073EE4: - adds r3, 0x4 - adds r4, 0x1 - cmp r4, r8 - blt _08073EB2 -_08073EEC: - movs r0, 0x1 - negs r0, r0 - cmp r12, r0 - bne _08073F40 - mov r7, r12 - str r7, [sp, 0xAC] - movs r4, 0 - cmp r4, r8 - bge _08073F38 - add r0, sp, 0xA8 - ldrb r0, [r0] - mov r9, r0 - add r3, sp, 0x54 -_08073F06: - ldr r2, [r3] - ldrb r1, [r2] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08073F30 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _08073F30 - ldrb r1, [r2, 0x2] - cmp r9, r1 - bne _08073F30 - ldrb r0, [r2, 0x1] - cmp r0, 0x63 - beq _08073F30 - ldr r7, [sp, 0xAC] - cmp r7, r0 - bge _08073F30 - str r0, [sp, 0xAC] - mov r12, r4 -_08073F30: - adds r3, 0x4 - adds r4, 0x1 - cmp r4, r8 - blt _08073F06 -_08073F38: - movs r0, 0x1 - negs r0, r0 - cmp r12, r0 - beq _08073FA8 -_08073F40: - add r0, sp, 0x54 - mov r1, r12 - lsls r4, r1, 2 - adds r3, r0, r4 - ldr r2, [r3] - ldrb r1, [r2, 0x1] - ldrb r0, [r5, 0x1] - adds r1, r0 - cmp r1, 0x62 - ble _08073F56 - movs r1, 0x63 -_08073F56: - strb r1, [r2, 0x1] - ldrb r1, [r5] - movs r0, 0x8 - ands r0, r1 - cmp r0, 0 - beq _08073F6C - ldr r0, [r3] - ldrb r1, [r0] - movs r2, 0x8 - orrs r1, r2 - strb r1, [r0] -_08073F6C: - ldr r0, _08073F98 - adds r1, r5, 0 - bl sub_8045BF8 - adds r0, r6, 0x4 - movs r1, 0x1 - bl sub_80461C8 - movs r0, 0xA5 - lsls r0, 1 - bl PlaySoundEffect - mov r7, sp - adds r0, r7, r4 - ldr r0, [r0] - cmp r0, 0 - bge _08073FA0 - ldr r0, _08073F9C - b _0807404C - .align 2, 0 -_08073F94: .4byte 0x00ff0008 -_08073F98: .4byte gUnknown_202DE58 -_08073F9C: .4byte gUnknown_80F9018 -_08073FA0: - ldr r0, _08073FA4 - b _0807404C - .align 2, 0 -_08073FA4: .4byte gUnknown_80F9050 -_08073FA8: - movs r4, 0 - cmp r4, r8 - bge _08073FD2 - ldr r0, [sp, 0x54] - ldrb r1, [r0] - movs r0, 0x1 - ands r0, r1 - cmp r0, 0 - beq _08073FD2 - movs r3, 0x1 - add r2, sp, 0x54 -_08073FBE: - adds r2, 0x4 - adds r4, 0x1 - cmp r4, r8 - bge _08073FD2 - ldr r0, [r2] - ldrb r1, [r0] - adds r0, r3, 0 - ands r0, r1 - cmp r0, 0 - bne _08073FBE -_08073FD2: - cmp r4, r8 - bne _08073FEC - ldr r0, _08073FE4 - adds r1, r5, 0 - bl sub_8045BF8 - ldr r0, _08073FE8 - b _0807404C - .align 2, 0 -_08073FE4: .4byte gUnknown_202DE58 -_08073FE8: .4byte gUnknown_80F8F54 -_08073FEC: - mov r1, r10 - ldrb r0, [r1, 0x6] - cmp r0, 0 - beq _08074000 - ldr r0, _08073FFC - bl PlaySoundEffect - b _08074008 - .align 2, 0 -_08073FFC: .4byte 0x0000014b -_08074000: - movs r0, 0xA5 - lsls r0, 1 - bl PlaySoundEffect -_08074008: - lsls r0, r4, 2 - add r0, sp - ldr r0, [r0] - cmp r0, 0 - bge _08074034 - ldr r0, [r5] - mov r7, r10 - str r0, [r7, 0x60] - ldr r0, _0807402C - adds r1, r5, 0 - bl sub_8045BF8 - adds r0, r6, 0x4 - movs r1, 0x1 - bl sub_80461C8 - ldr r0, _08074030 - b _0807404C - .align 2, 0 -_0807402C: .4byte gUnknown_202DE58 -_08074030: .4byte gUnknown_80F9018 -_08074034: - adds r0, r5, 0 - bl AddItemToInventory - lsls r0, 24 - cmp r0, 0 - beq _08074060 - ldr r0, _08074058 - adds r1, r6, 0 - movs r2, 0 - bl SetMessageArgument - ldr r0, _0807405C -_0807404C: - ldr r1, [r0] - adds r0, r6, 0 - bl sub_805239C - b _0807407A - .align 2, 0 -_08074058: .4byte gAvailablePokemonNames -_0807405C: .4byte gUnknown_80F8FAC -_08074060: - ldr r0, _0807408C - adds r1, r5, 0 - bl sub_8045BF8 - adds r0, r6, 0x4 - movs r1, 0x1 - bl sub_80461C8 - ldr r0, _08074090 - ldr r1, [r0] - adds r0, r6, 0 - bl sub_805239C -_0807407A: - add sp, 0xB0 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807408C: .4byte gUnknown_202DE58 -_08074090: .4byte gUnknown_80F9050 - thumb_func_end sub_8073D14 - thumb_func_start sub_8074094 sub_8074094: push {r4-r7,lr} diff --git a/include/constants/dungeon.h b/include/constants/dungeon.h index a1e7b834e..34b160728 100644 --- a/include/constants/dungeon.h +++ b/include/constants/dungeon.h @@ -108,4 +108,12 @@ enum DungeonID NUM_DUNGEONS }; +static inline bool8 IsClientOrTeamBase(s32 joinedDungeon) +{ + if (joinedDungeon == DUNGEON_JOIN_LOCATION_CLIENT_POKEMON || joinedDungeon == DUNGEON_RESCUE_TEAM_BASE) + return TRUE; + else + return FALSE; +} + #endif diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index 750e6ab20..91bb5a778 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -2616,14 +2616,6 @@ bool8 sub_805EC2C(Entity *a0, s32 x, s32 y) return sub_8070564(a0, &pos); } -static inline bool8 IsClientOrTeamBase(s32 joinedDungeon) -{ - if (joinedDungeon == DUNGEON_JOIN_LOCATION_CLIENT_POKEMON || joinedDungeon == DUNGEON_RESCUE_TEAM_BASE) - return TRUE; - else - return FALSE; -} - bool8 sub_805EC4C(Entity *a0, u8 a1) { Position pos; diff --git a/src/code_8073CF0.c b/src/code_8073CF0.c index db91b35e1..e96aab687 100644 --- a/src/code_8073CF0.c +++ b/src/code_8073CF0.c @@ -1,9 +1,23 @@ #include "global.h" +#include "dungeon_util.h" +#include "items.h" +#include "dungeon_ai_targeting.h" +#include "code_8045A00.h" #include "structs/dungeon_entity.h" +#include "structs/map.h" +#include "dungeon_music.h" +#include "constants/dungeon.h" +extern bool8 sub_8044B28(void); extern void sub_8067110(Entity *); extern void sub_80671A0(Entity *); extern void sub_8073D14(Entity *); +extern void sub_8045BF8(u8 *, Item *); +extern void sub_805239C(Entity *, const u8 *); +extern bool8 sub_80461C8(Position *, u32); + +extern u8 gUnknown_202DE58[]; +extern u8 gAvailablePokemonNames[]; void HandleEatAIAction(Entity *pokemon) { @@ -20,3 +34,159 @@ void HandlePickUpAIAction(Entity *pokemon) sub_8073D14(pokemon); } +extern const u8 *gUnknown_80F8F88; +extern const u8 *gUnknown_80F9054; +extern const u8 *gUnknown_80F9018; +extern const u8 *gUnknown_80F9050; +extern const u8 *gUnknown_80F8F54; +extern const u8 *gUnknown_80F8FAC; + +void sub_8073D14(Entity *entity) +{ + Item *groundItem; + EntityInfo *_entityInfo; + EntityInfo *entityInfo = entity->info; + Entity *tileObject = GetTileAtEntitySafe(entity)->object; + if (tileObject == NULL) + return; + if (sub_8044B28()) + return; + SetMessageArgument(gAvailablePokemonNames, entity, 0); + if (entityInfo->isTeamLeader) + return; + if (entityInfo->shopkeeper == 1) + return; + if (IsClientOrTeamBase(entityInfo->joinedAt.joinedAt)) + return; + if (entityInfo->clientType == 1) + return; + + _entityInfo = entity->info; // Reloaded as a new variable for some reason. + groundItem = GetItemData(tileObject); + if (groundItem->flags & ITEM_FLAG_IN_SHOP) + return; + + if (ShouldMonsterRunAwayAndShowEffect(entity, TRUE)) { + sub_8045BF8(gUnknown_202DE58, groundItem); + SetMessageArgument(gAvailablePokemonNames, entity, 0); + sub_805239C(entity, gUnknown_80F8F88); + } + else if (!_entityInfo->isNotTeamMember && GetItemCategory(groundItem->id) == CATEGORY_POKE) { + // Why check the same thing again? + if (_entityInfo->isNotTeamMember) { + PlaySoundEffect(0x14B); + } + else { + PlaySoundEffect(0x14C); + } + AddToTeamMoney(GetMoneyValue(groundItem)); + sub_8045BF8(gUnknown_202DE58, groundItem); + sub_80461C8(&entity->pos, 1); + sub_805239C(entity, gUnknown_80F9054); + } + else { + s32 i, nItems, newInventoryId; + s32 inventoryIds[INVENTORY_SIZE + 1]; // plus held + Item *carriedItems[INVENTORY_SIZE + 1]; // plus held + s32 newQuantity; + + if (gDungeon->unk65B && !_entityInfo->isNotTeamMember) { + for (i = 0; i < INVENTORY_SIZE; i++) { + carriedItems[i] = &gTeamInventoryRef->teamItems[i]; + inventoryIds[i] = i; + } + carriedItems[INVENTORY_SIZE] = &_entityInfo->heldItem; + inventoryIds[INVENTORY_SIZE] = -1; + nItems = INVENTORY_SIZE + 1; + } + else { + carriedItems[0] = &_entityInfo->heldItem; + inventoryIds[0] = -1; + nItems = 1; + } + + if ((groundItem->id < 9) && !(groundItem->flags & ITEM_FLAG_IN_SHOP)) { + newInventoryId = -1; + newQuantity = -1; + for (i = 0; i < nItems; i++) { + if (carriedItems[i]->flags & ITEM_FLAG_EXISTS + && !(carriedItems[i]->flags & ITEM_FLAG_IN_SHOP) + && ((groundItem->id == carriedItems[i]->id) && (groundItem->flags & ITEM_FLAG_STICKY) == (carriedItems[i]->flags & ITEM_FLAG_STICKY)) + && carriedItems[i]->quantity != 99 && newQuantity < carriedItems[i]->quantity) + { + newQuantity = carriedItems[i]->quantity; + newInventoryId = i; + } + } + + if (newInventoryId == -1) { + newQuantity = -1; + for (i = 0; i < nItems; i++) { + if (carriedItems[i]->flags & ITEM_FLAG_EXISTS + && !(carriedItems[i]->flags & ITEM_FLAG_IN_SHOP) + && groundItem->id == carriedItems[i]->id + && carriedItems[i]->quantity != 99 + && newQuantity < carriedItems[i]->quantity) + { + newQuantity = carriedItems[i]->quantity; + newInventoryId = i; + } + } + } + + if (newInventoryId != -1) { + s32 quantity = carriedItems[newInventoryId]->quantity + groundItem->quantity; + if (quantity >= 99) + quantity = 99; + carriedItems[newInventoryId]->quantity = quantity; + if (groundItem->flags & ITEM_FLAG_STICKY) + carriedItems[newInventoryId]->flags |= ITEM_FLAG_STICKY; + + sub_8045BF8(gUnknown_202DE58, groundItem); + sub_80461C8(&entity->pos, 1); + PlaySoundEffect(0x14A); + if (inventoryIds[newInventoryId] <= -1) + sub_805239C(entity, gUnknown_80F9018); + else + sub_805239C(entity, gUnknown_80F9050); + + return; + } + } + + for (i = 0; i < nItems; i++) { + if (!(carriedItems[i]->flags & ITEM_FLAG_EXISTS)) + break; + } + + if (i == nItems) { + sub_8045BF8(gUnknown_202DE58, groundItem); + sub_805239C(entity, gUnknown_80F8F54); + } + else { + if (_entityInfo->isNotTeamMember) { + PlaySoundEffect(0x14B); + } + else { + PlaySoundEffect(0x14A); + } + + if (inventoryIds[i] <= -1) { + _entityInfo->heldItem = *groundItem; + sub_8045BF8(gUnknown_202DE58, groundItem); + sub_80461C8(&entity->pos, 1); + sub_805239C(entity, gUnknown_80F9018); + } + else if (AddItemToInventory(groundItem)) { + SetMessageArgument(gAvailablePokemonNames, entity, 0); + sub_805239C(entity, gUnknown_80F8FAC); + } + else { + sub_8045BF8(gUnknown_202DE58, groundItem); + sub_80461C8(&entity->pos, 1); + sub_805239C(entity, gUnknown_80F9050); + } + } + } +} +