From 22d0b412474a1a0a2627a47c19e2503e39f2ca86 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 5 Dec 2024 11:46:08 +0100 Subject: [PATCH] sub_807EFFC --- asm/code_807E5AC.s | 687 --------------------------------------------- src/code_807E5AC.c | 248 +++++++++++++++- 2 files changed, 241 insertions(+), 694 deletions(-) diff --git a/asm/code_807E5AC.s b/asm/code_807E5AC.s index 4012fcf22..e5547873b 100644 --- a/asm/code_807E5AC.s +++ b/asm/code_807E5AC.s @@ -6,693 +6,6 @@ .text - thumb_func_start sub_807EC28 -sub_807EC28: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x1C - lsls r0, 24 - lsrs r0, 24 - mov r8, r0 - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - beq _0807EC46 - b _0807EF32 -_0807EC46: - bl GetLeader - adds r7, r0, 0 - ldr r0, [r7, 0x70] - mov r9, r0 - ldr r4, _0807ECB4 - ldr r0, [r4] - movs r5, 0xD3 - lsls r5, 3 - adds r0, r5 - ldrb r0, [r0] - str r0, [sp, 0x8] - adds r0, r7, 0 - bl GetTileAtEntitySafe - ldrh r0, [r0] - lsrs r0, 5 - mov r10, r0 - movs r0, 0x1 - mov r1, r10 - ands r1, r0 - mov r10, r1 - ldr r0, [r4] - adds r0, r5 - strb r1, [r0] - ldr r0, [r4] - ldr r3, _0807ECB8 - adds r0, r3 - mov r2, r10 - strb r2, [r0] - ldr r2, [r4] - ldr r6, _0807ECBC - adds r0, r2, r6 - ldrb r1, [r0] - cmp r1, 0 - beq _0807EC90 - b _0807EF32 -_0807EC90: - adds r6, 0x26 - adds r0, r2, r6 - ldr r0, [r0] - cmp r0, 0 - bne _0807EC9C - b _0807EF32 -_0807EC9C: - mov r0, r9 - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0807ECC0 - adds r0, r2, r5 - strb r1, [r0] - ldr r0, [r4] - adds r0, r3 - strb r1, [r0] - b _0807EF32 - .align 2, 0 -_0807ECB4: .4byte gDungeon -_0807ECB8: .4byte 0x00000699 -_0807ECBC: .4byte 0x0000066e -_0807ECC0: - movs r0, 0 - str r0, [sp, 0xC] - movs r6, 0 -_0807ECC6: - ldr r0, _0807ED48 - ldr r0, [r0] - lsls r1, r6, 2 - ldr r2, _0807ED4C - adds r0, r2 - adds r0, r1 - ldr r5, [r0] - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - beq _0807ED0E - ldr r0, [r5, 0x70] - ldrb r0, [r0, 0x8] - cmp r0, 0x1 - bne _0807ED0E - adds r0, r5, 0 - bl sub_8070BC0 - lsls r0, 24 - cmp r0, 0 - beq _0807ED0E - adds r0, r7, 0 - bl GetEntityRoom - adds r4, r0, 0 - adds r0, r5, 0 - bl GetEntityRoom - lsls r4, 24 - lsls r0, 24 - cmp r4, r0 - bne _0807ED0E - movs r0, 0x1 - str r0, [sp, 0xC] -_0807ED0E: - adds r6, 0x1 - cmp r6, 0xF - ble _0807ECC6 - ldr r1, _0807ED50 - ldr r0, [sp] - ands r0, r1 - movs r1, 0xBE - lsls r1, 1 - orrs r0, r1 - ldr r1, _0807ED54 - ands r0, r1 - str r0, [sp] - ldr r1, [sp, 0x8] - cmp r1, 0 - bne _0807ED5C - mov r2, r10 - cmp r2, 0x1 - bne _0807ED64 - ldr r6, [sp, 0xC] - cmp r6, 0 - bne _0807ED3A - b _0807EF32 -_0807ED3A: - ldr r0, _0807ED58 - ldr r1, [r0] - mov r0, sp - movs r2, 0x1 - bl DisplayDungeonMessage - b _0807EF32 - .align 2, 0 -_0807ED48: .4byte gDungeon -_0807ED4C: .4byte 0x0001358c -_0807ED50: .4byte 0xffff0000 -_0807ED54: .4byte 0xff00ffff -_0807ED58: .4byte gUnknown_80FE674 -_0807ED5C: - mov r0, r10 - cmp r0, 0x1 - bne _0807ED64 - b _0807EF32 -_0807ED64: - ldr r1, [sp, 0x8] - cmp r1, 0x1 - bne _0807ED70 - mov r2, r10 - cmp r2, 0 - beq _0807ED78 -_0807ED70: - mov r6, r8 - cmp r6, 0 - bne _0807ED78 - b _0807EF32 -_0807ED78: - movs r0, 0 - str r0, [sp, 0x10] - movs r1, 0 - str r1, [sp, 0x14] - bl sub_807EF48 - lsls r0, 24 - cmp r0, 0 - bne _0807ED8C - b _0807EECC -_0807ED8C: - movs r2, 0x1 - str r2, [sp, 0x14] - movs r6, 0 -_0807ED92: - ldr r0, _0807EE90 - ldr r0, [r0] - lsls r1, r6, 2 - ldr r2, _0807EE94 - adds r0, r2 - adds r0, r1 - ldr r5, [r0] - adds r0, r5, 0 - bl EntityExists - lsls r0, 24 - cmp r0, 0 - bne _0807EDAE - b _0807EEC4 -_0807EDAE: - ldr r0, [r5, 0x70] - ldrb r0, [r0, 0x8] - cmp r0, 0x1 - beq _0807EDB8 - b _0807EEC4 -_0807EDB8: - adds r0, r5, 0 - bl sub_8070BC0 - lsls r0, 24 - cmp r0, 0 - bne _0807EDC6 - b _0807EEC4 -_0807EDC6: - adds r0, r7, 0 - bl GetEntityRoom - adds r4, r0, 0 - adds r0, r5, 0 - bl GetEntityRoom - lsls r4, 24 - lsls r0, 24 - cmp r4, r0 - bne _0807EEC4 - movs r6, 0x1 - str r6, [sp, 0x10] - movs r0, 0x4 - ldrsh r1, [r7, r0] - movs r2, 0x4 - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0807EDF0 - negs r1, r1 -_0807EDF0: - cmp r1, 0x1 - bgt _0807EE10 - movs r6, 0x6 - ldrsh r1, [r7, r6] - movs r2, 0x6 - ldrsh r0, [r5, r2] - subs r1, r0 - cmp r1, 0 - bge _0807EE04 - negs r1, r1 -_0807EE04: - adds r6, r7, 0x4 - mov r9, r6 - adds r0, r5, 0x4 - mov r8, r0 - cmp r1, 0x1 - ble _0807EE72 -_0807EE10: - movs r3, 0x1 - negs r3, r3 - add r6, sp, 0x4 - adds r1, r7, 0x4 - mov r9, r1 - adds r2, r5, 0x4 - mov r8, r2 -_0807EE1E: - movs r4, 0x1 - negs r4, r4 -_0807EE22: - ldrh r0, [r7, 0x4] - adds r0, r3 - lsls r0, 16 - lsrs r0, 16 - ldr r1, _0807EE98 - ldr r2, [sp, 0x4] - ands r2, r1 - orrs r2, r0 - str r2, [sp, 0x4] - ldrh r0, [r7, 0x6] - adds r0, r4 - lsls r0, 16 - ldr r1, _0807EE9C - ands r1, r2 - orrs r1, r0 - str r1, [sp, 0x4] - movs r2, 0 - ldrsh r0, [r6, r2] - asrs r1, 16 - str r3, [sp, 0x18] - bl GetTile - ldrb r0, [r0, 0x9] - ldr r3, [sp, 0x18] - cmp r0, 0xFF - beq _0807EE66 - adds r0, r5, 0 - adds r1, r6, 0 - bl sub_80703A0 - lsls r0, 24 - ldr r3, [sp, 0x18] - cmp r0, 0 - beq _0807EEA0 -_0807EE66: - adds r4, 0x1 - cmp r4, 0x1 - ble _0807EE22 - adds r3, 0x1 - cmp r3, 0x1 - ble _0807EE1E -_0807EE72: - adds r0, r7, 0 - bl sub_8070BC0 - lsls r0, 24 - cmp r0, 0 - beq _0807EEAE - mov r0, r9 - mov r1, r8 - bl GetDirectionTowardsPosition - adds r1, r0, 0 - adds r0, r7, 0 - bl sub_806CE34 - b _0807EEB2 - .align 2, 0 -_0807EE90: .4byte gDungeon -_0807EE94: .4byte 0x0001358c -_0807EE98: .4byte 0xffff0000 -_0807EE9C: .4byte 0x0000ffff -_0807EEA0: - adds r0, r7, 0 - adds r1, r5, 0 - movs r2, 0x3 - adds r3, r6, 0 - bl WarpTarget - b _0807EE72 -_0807EEAE: - movs r6, 0 - str r6, [sp, 0x10] -_0807EEB2: - mov r0, r8 - mov r1, r9 - bl GetDirectionTowardsPosition - adds r1, r0, 0 - adds r0, r5, 0 - bl sub_806CE68 - b _0807EECC -_0807EEC4: - adds r6, 0x1 - cmp r6, 0xF - bgt _0807EECC - b _0807ED92 -_0807EECC: - ldr r0, [sp, 0x14] - cmp r0, 0 - beq _0807EF04 - ldr r1, [sp, 0x10] - cmp r1, 0 - beq _0807EEDE - ldr r0, [sp, 0xC] - cmp r0, 0 - bne _0807EF04 -_0807EEDE: - ldr r0, _0807EEF8 - ldr r0, [r0] - ldr r2, _0807EEFC - adds r1, r0, r2 - ldr r6, _0807EF00 - adds r0, r6 - ldr r1, [r1] - ldr r0, [r0] - cmp r1, r0 - ble _0807EF32 -_0807EEF2: - bl sub_807F33C - b _0807EF32 - .align 2, 0 -_0807EEF8: .4byte gDungeon -_0807EEFC: .4byte 0x00000694 -_0807EF00: .4byte 0x0000068c -_0807EF04: - ldr r0, [sp, 0x10] - bl sub_807EFFC - ldr r0, [sp, 0x10] - bl sub_807F19C - cmp r0, 0 - bne _0807EEF2 - ldr r0, [sp, 0x8] - cmp r0, 0x1 - bne _0807EF32 - mov r1, r10 - cmp r1, 0 - bne _0807EF32 - ldr r2, [sp, 0xC] - cmp r2, 0 - beq _0807EF32 - ldr r0, _0807EF44 - ldr r1, [r0] - mov r0, sp - movs r2, 0x1 - bl DisplayDungeonMessage -_0807EF32: - add sp, 0x1C - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807EF44: .4byte gUnknown_80FE65C - thumb_func_end sub_807EC28 - - thumb_func_start sub_807EF48 -sub_807EF48: - push {lr} - ldr r0, _0807EF70 - ldr r2, [r0] - ldr r1, _0807EF74 - adds r0, r2, r1 - ldr r3, _0807EF78 - adds r1, r2, r3 - ldr r0, [r0] - ldr r1, [r1] - subs r0, r1 - cmp r0, 0 - bgt _0807EF7C - movs r1, 0xD2 - lsls r1, 3 - adds r0, r2, r1 - ldr r0, [r0] - cmp r0, 0 - bne _0807EF7C - movs r0, 0 - b _0807EF7E - .align 2, 0 -_0807EF70: .4byte gDungeon -_0807EF74: .4byte 0x00000694 -_0807EF78: .4byte 0x0000068c -_0807EF7C: - movs r0, 0x1 -_0807EF7E: - pop {r1} - bx r1 - thumb_func_end sub_807EF48 - - thumb_func_start sub_807EF84 -sub_807EF84: - push {r4,lr} - sub sp, 0x4 - ldr r1, _0807EFD0 - ldr r0, [sp] - ands r0, r1 - movs r1, 0xBE - lsls r1, 1 - orrs r0, r1 - ldr r1, _0807EFD4 - ands r0, r1 - str r0, [sp] - movs r0, 0x1 - bl sub_807EFFC - movs r0, 0x1 - bl sub_807F19C - adds r4, r0, 0 - cmp r4, 0 - beq _0807EFE2 - bl GetLeader - bl GetTileAtEntitySafe - ldrh r1, [r0] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _0807EFDC - cmp r4, 0x2 - beq _0807EFEE - ldr r0, _0807EFD8 - ldr r1, [r0] - mov r0, sp - movs r2, 0x1 - bl DisplayDungeonMessage - b _0807EFEE - .align 2, 0 -_0807EFD0: .4byte 0xffff0000 -_0807EFD4: .4byte 0xff00ffff -_0807EFD8: .4byte gUnknown_80FE63C -_0807EFDC: - bl sub_807F33C - b _0807EFEE -_0807EFE2: - ldr r0, _0807EFF8 - ldr r1, [r0] - mov r0, sp - movs r2, 0x1 - bl DisplayDungeonMessage -_0807EFEE: - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_0807EFF8: .4byte gUnknown_80FE5F0 - thumb_func_end sub_807EF84 - - thumb_func_start sub_807EFFC -sub_807EFFC: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x10 - lsls r0, 24 - lsrs r3, r0, 24 - ldr r4, _0807F168 - ldr r0, [r4] - movs r5, 0xD2 - lsls r5, 3 - adds r2, r0, r5 - ldr r0, [r2] - cmp r0, 0 - bne _0807F01E - b _0807F158 -_0807F01E: - ldr r1, _0807F16C - ldr r0, [sp] - ands r0, r1 - movs r1, 0xBE - lsls r1, 1 - orrs r0, r1 - ldr r1, _0807F170 - ands r0, r1 - str r0, [sp] - cmp r3, 0 - bne _0807F036 - b _0807F158 -_0807F036: - ldr r1, _0807F174 - ldr r0, [r2] - str r0, [r1] - ldr r0, _0807F178 - ldr r1, [r0] - mov r0, sp - movs r2, 0x1 - bl DisplayDungeonYesNoMessage - cmp r0, 0x1 - beq _0807F04E - b _0807F158 -_0807F04E: - movs r0, 0xA6 - lsls r0, 1 - bl PlaySoundEffect - ldr r0, [r4] - adds r0, r5 - ldr r0, [r0] - bl AddToTeamMoney - ldr r0, [r4] - ldr r2, _0807F17C - adds r1, r0, r2 - ldr r1, [r1] - str r1, [sp, 0xC] - ldr r2, _0807F180 - adds r1, r0, r2 - ldr r6, [r1] - ldr r1, _0807F184 - adds r0, r1 - ldr r0, [r0] - cmp r6, r0 - bgt _0807F134 - mov r8, r4 -_0807F07C: - mov r2, r8 - ldr r0, [r2] - ldr r2, _0807F188 - adds r1, r0, r2 - ldr r5, [r1] - ldr r1, _0807F18C - adds r0, r1 - ldr r0, [r0] - adds r2, r6, 0x1 - mov r10, r2 - cmp r5, r0 - bgt _0807F124 - lsls r0, r6, 16 - lsrs r0, 16 - mov r9, r0 -_0807F09A: - lsls r0, r5, 16 - mov r1, r9 - orrs r0, r1 - str r0, [sp, 0x4] - adds r0, r6, 0 - adds r1, r5, 0 - bl GetTile - adds r4, r0, 0 - ldrh r1, [r4] - movs r0, 0x20 - ands r0, r1 - cmp r0, 0 - beq _0807F114 - ldr r0, [r4, 0x14] - cmp r0, 0 - beq _0807F114 - bl GetEntityType - cmp r0, 0x3 - bne _0807F114 - ldr r0, [r4, 0x14] - bl GetItemData - adds r2, r0, 0 - ldrb r1, [r2] - movs r7, 0x2 - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0807F114 - ldr r0, [r2] - str r0, [sp, 0x8] - add r4, sp, 0x4 - adds r0, r4, 0 - movs r1, 0x1 - bl sub_80461C8 - ldr r0, [sp, 0x8] - lsrs r0, 16 - lsls r0, 24 - lsrs r0, 24 - bl CanSellItem - lsls r0, 24 - add r3, sp, 0x8 - cmp r0, 0 - beq _0807F10A - ldrb r0, [r3] - adds r2, r7, 0 - orrs r2, r0 - ldr r1, _0807F190 - ldr r0, [sp, 0x8] - ands r0, r1 - orrs r0, r2 - str r0, [sp, 0x8] -_0807F10A: - adds r0, r4, 0 - adds r1, r3, 0 - movs r2, 0x1 - bl sub_80460F8 -_0807F114: - adds r5, 0x1 - mov r2, r8 - ldr r0, [r2] - ldr r1, _0807F18C - adds r0, r1 - ldr r0, [r0] - cmp r5, r0 - ble _0807F09A -_0807F124: - mov r6, r10 - mov r2, r8 - ldr r0, [r2] - ldr r1, _0807F184 - adds r0, r1 - ldr r0, [r0] - cmp r6, r0 - ble _0807F07C -_0807F134: - ldr r0, _0807F168 - ldr r0, [r0] - ldr r1, _0807F194 - adds r2, r0, r1 - subs r1, 0x8 - adds r0, r1 - ldr r1, [r0] - ldr r0, [sp, 0xC] - subs r1, r0 - ldr r0, [r2] - adds r0, r1 - str r0, [r2] - ldr r0, _0807F198 - ldr r1, [r0] - mov r0, sp - movs r2, 0x1 - bl DisplayDungeonMessage -_0807F158: - add sp, 0x10 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0807F168: .4byte gDungeon -_0807F16C: .4byte 0xffff0000 -_0807F170: .4byte 0xff00ffff -_0807F174: .4byte gFormatArgs -_0807F178: .4byte gUnknown_80FE5C0 -_0807F17C: .4byte 0x0000068c -_0807F180: .4byte 0x0000e240 -_0807F184: .4byte 0x0000e248 -_0807F188: .4byte 0x0000e244 -_0807F18C: .4byte 0x0000e24c -_0807F190: .4byte 0xffffff00 -_0807F194: .4byte 0x00000694 -_0807F198: .4byte gUnknown_80FE4F4 - thumb_func_end sub_807EFFC thumb_func_start sub_807F19C sub_807F19C: diff --git a/src/code_807E5AC.c b/src/code_807E5AC.c index ed75d107d..4d7540a82 100644 --- a/src/code_807E5AC.c +++ b/src/code_807E5AC.c @@ -5,13 +5,19 @@ #include "dungeon.h" #include "dungeon_config.h" #include "dungeon_leader.h" +#include "dungeon_music.h" #include "dungeon_util.h" #include "pokemon.h" +#include "structs/map.h" #include "dungeon_message.h" #include "dungeon_pokemon_attributes.h" #include "string_format.h" #include "dungeon_movement.h" +#include "dungeon_capabilities.h" +#include "dungeon_map_access.h" +#include "position_util.h" #include "code_806CD90.h" +#include "code_807CD9C.h" #include "code_805D8C8.h" #include "constants/ability.h" #include "constants/monster.h" @@ -19,21 +25,39 @@ extern u8 gUnknown_203B40D; extern OpenedFile *gUnknown_202ECA0; -extern void sub_804178C(u32); +extern void sub_804178C(u32); +extern bool8 sub_80461C8(DungeonPos *, u32); extern void sub_80429D8(Entity *r0); extern s32 GetMonsterApparentID(Entity *pokemon, s32 id); -void sub_803E874(bool8 r10, s32 r9); -void GetWeatherName(u8 *dst, u8 weatherId); +extern void sub_803E874(bool8 r10, s32 r9); +extern void GetWeatherName(u8 *dst, u8 weatherId); extern s32 CalculateStatusTurns(Entity *target, const s16 *turnRange, bool8 factorCurerSkills); extern void sub_80838EC(u8 *a); +extern bool8 sub_8044B28(void); +extern void sub_80460F8(DungeonPos *, Item *, u32); void sub_807E7FC(bool8 arg0); +void sub_807EFFC(bool8 arg0); +s32 sub_807F19C(bool8 arg0); void sub_807E8F0(Entity *pokemon); +bool8 sub_807EF48(void); +void sub_807F33C(void); + +extern const u8 *gWeatherNames[]; extern const u8 *const gUnknown_80FC5E0; extern const u8 *const gUnknown_80FA778; extern const u8 *const gUnknown_80FA758; +extern const u8 *const gUnknown_80FE674; +extern const u8 *const gUnknown_80FE65C; +extern const u8 *const gUnknown_80FE63C; +extern const u8 *const gUnknown_80FE5F0; +extern const u8 *const gUnknown_80FAD8C; +extern const u8 *const gUnknown_80FADB0; +extern const u8 *const gUnknown_80FE5C0; +extern const u8 *const gUnknown_80FE4F4; + // Note: gUnknown_202ECA0 file's 2d array is read as 1d array in functions below, be careful! void sub_807E698(bool8 arg0) @@ -185,10 +209,6 @@ void sub_807E8F0(Entity *pokemon) } } -extern const u8 *gWeatherNames[]; -extern const u8 *const gUnknown_80FAD8C; -extern const u8 *const gUnknown_80FADB0; - void GetWeatherName(u8 *buffer, u8 weather) { strcpy(buffer, gWeatherNames[weather]); @@ -266,3 +286,217 @@ bool8 sub_807EAA0(bool8 arg0, bool8 arg1) return ret; } + +void sub_807EC28(bool8 arg0) +{ + Entity *leader; + EntityInfo *leaderInfo; + u32 var_34; + bool32 isShopTile; + + if (sub_8044B28()) + return; + + leader = GetLeader(); + leaderInfo = GetEntInfo(leader); + var_34 = gDungeon->unk644.unk54; + isShopTile = (GetTileAtEntitySafe(leader)->terrainType & TERRAIN_TYPE_SHOP) != 0; + gDungeon->unk644.unk54 = isShopTile; + gDungeon->unk644.unk55 = isShopTile; + if (gDungeon->unk644.unk2A || gDungeon->unk644.unk50 == 0) + return; + + if (leaderInfo->invisibleClassStatus.status == STATUS_INVISIBLE) { + gDungeon->unk644.unk54 = 0; + gDungeon->unk644.unk55 = 0; + } + else { + s32 i; + struct MonDialogueSpriteInfo dialogueInfo; + bool8 var_30 = FALSE; + bool8 var_2C; + bool8 var_28; + + for (i = 0; i < DUNGEON_MAX_WILD_POKEMON; i++) { + Entity *wildMon = gDungeon->wildPokemon[i]; + if (EntityExists(wildMon)) { + EntityInfo *wildMonInfo = GetEntInfo(wildMon); + if (wildMonInfo->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER && sub_8070BC0(wildMon) && GetEntityRoom(leader) == GetEntityRoom(wildMon)) { + var_30 = TRUE; + } + } + } + + dialogueInfo.species = MONSTER_KECLEON; + dialogueInfo.spriteId = 0; + if (var_34 == 0) { + if (isShopTile == TRUE) { + if (var_30) { + DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE674, TRUE); // Ah welcome! + } + return; + } + } + else { + if (isShopTile == TRUE) { + return; + } + } + + if ((var_34 != 1 || isShopTile) && !arg0) { + return; + } + + var_2C = FALSE; + var_28 = FALSE; + if (sub_807EF48()) { + var_28 = TRUE; + for (i = 0; i < DUNGEON_MAX_WILD_POKEMON; i++) { + Entity *wildMon = gDungeon->wildPokemon[i]; + if (EntityExists(wildMon) + && GetEntInfo(wildMon)->shopkeeper == SHOPKEEPER_MODE_SHOPKEEPER + && sub_8070BC0(wildMon) + && GetEntityRoom(leader) == GetEntityRoom(wildMon)) + { + var_2C = TRUE; + if (abs(leader->pos.x - wildMon->pos.x) >= 2 || abs(leader->pos.y - wildMon->pos.y) >= 2) { + s32 x, y; + DungeonPos pos; + + for (x = -1; x < 2; x++) { + for (y = -1; y < 2; y++) { + pos.x = leader->pos.x + x; + pos.y = leader->pos.y + y; + if (GetTile(pos.x, pos.y)->room != CORRIDOR_ROOM) { + if (!sub_80703A0(wildMon, &pos)) { + WarpTarget(leader, wildMon, 3, &pos); + goto LOOP_BREAK; // Used to break out of the nested loops + } + } + } + } + LOOP_BREAK: + } + + if (sub_8070BC0(leader)) { + sub_806CE34(leader, GetDirectionTowardsPosition(&leader->pos, &wildMon->pos)); + } + else { + var_2C = FALSE; + } + + sub_806CE68(wildMon, GetDirectionTowardsPosition(&wildMon->pos, &leader->pos)); + break; + } + } + } + + if (var_28 && !var_2C) { + if (gDungeon->unk644.unk50 > gDungeon->unk644.unk48) { + sub_807F33C(); + } + } + else if (var_28 && !var_30) { + if (gDungeon->unk644.unk50 > gDungeon->unk644.unk48) { + sub_807F33C(); + } + } + else { + sub_807EFFC(var_2C); + if (sub_807F19C(var_2C)) { + sub_807F33C(); + } + else if (var_34 == 1 && !isShopTile && var_30) { + DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE65C, TRUE); // I await your next visit + } + } + } +} + +bool8 sub_807EF48(void) +{ + if ((gDungeon->unk644.unk50 - gDungeon->unk644.unk48) > 0) { + return TRUE; + } + if (gDungeon->unk644.unk4C != 0) { + return TRUE; + } + + return FALSE; +} + + +void sub_807EF84(void) +{ + s32 val; + struct MonDialogueSpriteInfo dialogueInfo; + + dialogueInfo.species = MONSTER_KECLEON; + dialogueInfo.spriteId = 0; + + sub_807EFFC(1); + val = sub_807F19C(1); + if (val != 0) { + Tile *tile = GetTileAtEntitySafe(GetLeader()); + if (tile->terrainType & TERRAIN_TYPE_SHOP) { + if (val != 2) { + DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE63C, 1); // This is very disappointing, please return any items before you leave. + } + } + else { + sub_807F33C(); + } + } + else { + DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE5F0, 1); // Looking forward to seeing you again! + } +} + +void sub_807EFFC(bool8 arg0) +{ + struct MonDialogueSpriteInfo dialogueInfo; + + if (gDungeon->unk644.unk4C == 0) + return; + + dialogueInfo.species = MONSTER_KECLEON; + dialogueInfo.spriteId = 0; + if (!arg0) + return; + + gFormatArgs[0] = gDungeon->unk644.unk4C; + if (DisplayDungeonYesNoMessage(&dialogueInfo, gUnknown_80FE5C0, TRUE) == 1) { // For the merch you have left, I shall pay X. Is that acceptable? + s32 x, y; + DungeonPos pos; + s32 local_24; + + PlaySoundEffect(0x14c); + AddToTeamMoney(gDungeon->unk644.unk4C); + local_24 = gDungeon->unk644.unk48; + for (x = gDungeon->kecleonShopPos.minX; x <= gDungeon->kecleonShopPos.maxX; x++) { + for (y = gDungeon->kecleonShopPos.minY; y <= gDungeon->kecleonShopPos.maxY; y++) { + const Tile *tile; + + pos.y = y; + pos.x = x; + tile = GetTile(x,y); + if (tile->terrainType & TERRAIN_TYPE_SHOP && tile->object != NULL && GetEntityType(tile->object) == ENTITY_ITEM) { + Item *itemPtr = GetItemData(tile->object); + if (!ItemInShop(itemPtr)) { + Item item = *itemPtr; + sub_80461C8(&pos, 1); + if (CanSellItem(item.id)) { + item.flags |= ITEM_FLAG_IN_SHOP; + } + sub_80460F8(&pos, &item, 1); + } + } + } + } + + gDungeon->unk644.unk50 += (gDungeon->unk644.unk48 - local_24); + DisplayDungeonMessage(&dialogueInfo, gUnknown_80FE4F4, 1); // Your patronage is valued + } +} + +//