diff --git a/asm/code_805D8C8.s b/asm/code_805D8C8.s index 9308f2ec0..cc18a6f8a 100644 --- a/asm/code_805D8C8.s +++ b/asm/code_805D8C8.s @@ -5,420 +5,6 @@ .text - thumb_func_start sub_805EC2C -sub_805EC2C: - push {lr} - sub sp, 0x4 - lsls r1, 16 - lsls r2, 16 - lsrs r1, 16 - orrs r1, r2 - str r1, [sp] - mov r1, sp - bl sub_8070564 - lsls r0, 24 - lsrs r0, 24 - add sp, 0x4 - pop {r1} - bx r1 - thumb_func_end sub_805EC2C - - thumb_func_start sub_805EC4C -sub_805EC4C: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - adds r5, r0, 0 - lsls r1, 24 - lsrs r1, 24 - mov r10, r1 - ldr r7, [r5, 0x70] - ldr r1, _0805ECC8 - adds r0, r7, 0 - adds r0, 0x46 - ldrb r0, [r0] - lsls r0, 2 - adds r0, r1 - ldrh r1, [r0] - ldrh r3, [r5, 0x4] - adds r1, r3 - lsls r1, 16 - ldrh r0, [r0, 0x2] - ldrh r3, [r5, 0x6] - adds r0, r3 - lsls r0, 16 - lsrs r2, r1, 16 - orrs r2, r0 - lsls r0, r2, 16 - asrs r0, 16 - asrs r1, r2, 16 - bl GetTile - ldr r0, [r0, 0x10] - mov r8, r0 - cmp r0, 0 - bne _0805EC94 - b _0805ED96 -_0805EC94: - mov r0, r8 - bl GetEntityType - cmp r0, 0x1 - bne _0805ED96 - mov r0, r8 - ldr r6, [r0, 0x70] - ldrb r0, [r6, 0x6] - cmp r0, 0 - beq _0805ECDC - ldrb r0, [r6, 0x8] - subs r0, 0x1 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x1 - bls _0805ECDC - adds r0, r6, 0 - adds r0, 0x40 - ldrb r0, [r0] - cmp r0, 0x4A - beq _0805ECC2 - cmp r0, 0x47 - bne _0805ECCC -_0805ECC2: - movs r0, 0x1 - b _0805ECCE - .align 2, 0 -_0805ECC8: .4byte gAdjacentTileOffsets -_0805ECCC: - movs r0, 0 -_0805ECCE: - cmp r0, 0 - bne _0805ECDC - adds r0, r6, 0 - adds r0, 0xA4 - ldrb r0, [r0] - cmp r0, 0x1 - bne _0805ED96 -_0805ECDC: - adds r0, r7, 0 - adds r0, 0xB0 - ldrb r0, [r0] - cmp r0, 0x2 - beq _0805ED96 - cmp r0, 0x1 - beq _0805ED96 - cmp r0, 0x7 - beq _0805ED96 - cmp r0, 0x5 - beq _0805ED96 - cmp r0, 0x3 - beq _0805ED96 - cmp r0, 0x4 - beq _0805ED96 - adds r0, r6, 0 - adds r0, 0xB0 - ldrb r0, [r0] - cmp r0, 0x2 - beq _0805ED96 - cmp r0, 0x1 - beq _0805ED96 - cmp r0, 0x7 - beq _0805ED96 - cmp r0, 0x5 - beq _0805ED96 - cmp r0, 0x3 - beq _0805ED96 - cmp r0, 0x4 - beq _0805ED96 - adds r0, r7, 0 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0x2 - beq _0805ED96 - adds r0, r6, 0 - adds r0, 0xBC - ldrb r0, [r0] - cmp r0, 0x2 - beq _0805ED96 - adds r0, r6, 0 - adds r0, 0xA8 - ldrb r0, [r0] - cmp r0, 0 - beq _0805ED3E - cmp r0, 0x2 - beq _0805ED3E - cmp r0, 0x4 - bne _0805ED96 -_0805ED3E: - adds r0, r7, 0 - adds r0, 0xA8 - ldrb r0, [r0] - cmp r0, 0 - beq _0805ED50 - cmp r0, 0x2 - beq _0805ED50 - cmp r0, 0x4 - bne _0805ED96 -_0805ED50: - mov r0, r8 - movs r1, 0 - bl IsCharging - lsls r0, 24 - cmp r0, 0 - bne _0805ED96 - adds r4, r7, 0 - adds r4, 0x46 - ldrb r1, [r4] - adds r0, r5, 0 - bl sub_8070F80 - lsls r0, 24 - mov r9, r4 - cmp r0, 0 - beq _0805ED96 - mov r1, r10 - cmp r1, 0 - beq _0805EDA0 - adds r1, r5, 0x4 - mov r0, r8 - bl sub_807049C - lsls r0, 24 - cmp r0, 0 - beq _0805EDA0 - ldr r0, _0805ED9C - ldr r1, [r0] - movs r0, 0 - movs r2, 0 - bl sub_8052B8C - cmp r0, 0 - bne _0805EDA0 -_0805ED96: - movs r0, 0 - b _0805EE1E - .align 2, 0 -_0805ED9C: .4byte gUnknown_8100208 -_0805EDA0: - adds r0, r7, 0 - adds r0, 0x44 - movs r1, 0x2 - bl SetMonsterActionFields - ldr r0, _0805EDC0 - ldrh r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _0805EDC4 - adds r1, r7, 0 - adds r1, 0x48 - movs r0, 0 - b _0805EDCA - .align 2, 0 -_0805EDC0: .4byte gRealInputs -_0805EDC4: - adds r1, r7, 0 - adds r1, 0x48 - movs r0, 0x1 -_0805EDCA: - strb r0, [r1] - ldrh r0, [r7] - movs r2, 0x80 - lsls r2, 8 - adds r5, r2, 0 - movs r4, 0 - orrs r0, r5 - strh r0, [r7] - adds r0, r6, 0 - adds r0, 0x44 - movs r1, 0x2 - bl SetMonsterActionFields - adds r0, r6, 0 - adds r0, 0x48 - strb r4, [r0] - mov r3, r9 - ldrb r0, [r3] - adds r0, 0x4 - movs r1, 0x7 - ands r0, r1 - adds r1, r6, 0 - adds r1, 0x46 - strb r0, [r1] - ldrh r0, [r6] - orrs r0, r5 - strh r0, [r6] - mov r0, r8 - ldrh r1, [r0, 0x4] - movs r2, 0xB6 - lsls r2, 1 - adds r0, r6, r2 - strh r1, [r0] - mov r3, r8 - ldrh r0, [r3, 0x6] - adds r2, 0x2 - adds r1, r6, r2 - strh r0, [r1] - ldr r0, _0805EE2C - ldr r1, [r0] - movs r0, 0x1 - strb r0, [r1, 0xE] -_0805EE1E: - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r1} - bx r1 - .align 2, 0 -_0805EE2C: .4byte gDungeon - thumb_func_end sub_805EC4C - - thumb_func_start sub_805EE30 -sub_805EE30: - push {r4-r7,lr} - mov r7, r8 - push {r7} - bl GetLeader - adds r5, r0, 0 - cmp r5, 0 - bne _0805EE42 - b _0805EF52 -_0805EE42: - bl sub_8044B28 - lsls r0, 24 - cmp r0, 0 - beq _0805EE4E - b _0805EF52 -_0805EE4E: - adds r0, r5, 0 - bl GetTileAtEntitySafe - adds r4, r0, 0 - adds r0, r5, 0 - movs r1, 0xD - bl IQSkillIsEnabled - lsls r0, 24 - cmp r0, 0 - beq _0805EE82 - ldr r0, [r5, 0x70] - adds r0, 0xE4 - ldrb r0, [r0] - cmp r0, 0x3 - beq _0805EE82 - adds r0, r5, 0 - movs r1, 0x9 - bl HasHeldItem - lsls r0, 24 - cmp r0, 0 - bne _0805EE82 - adds r0, r5, 0x4 - bl sub_804AE84 -_0805EE82: - ldrh r1, [r4] - movs r0, 0x80 - lsls r0, 2 - ands r0, r1 - cmp r0, 0 - beq _0805EE96 - ldr r0, _0805EEB0 - ldr r1, [r0] - movs r0, 0x1 - strb r0, [r1, 0x1] -_0805EE96: - ldr r4, [r4, 0x14] - cmp r4, 0 - beq _0805EF52 - adds r0, r4, 0 - bl GetEntityType - cmp r0, 0x5 - bhi _0805EF52 - lsls r0, 2 - ldr r1, _0805EEB4 - adds r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_0805EEB0: .4byte gDungeon -_0805EEB4: .4byte _0805EEB8 - .align 2, 0 -_0805EEB8: - .4byte _0805EF52 - .4byte _0805EF52 - .4byte _0805EED0 - .4byte _0805EF2A - .4byte _0805EF52 - .4byte _0805EF52 -_0805EED0: - adds r0, r4, 0 - bl GetTrapData - adds r6, r0, 0 - movs r0, 0 - mov r8, r0 - movs r7, 0 - adds r0, r5, 0 - movs r1, 0x13 - bl IQSkillIsEnabled - lsls r0, 24 - cmp r0, 0 - beq _0805EF00 - adds r1, r4, 0 - adds r1, 0x20 - ldrb r0, [r1] - cmp r0, 0 - bne _0805EF00 - movs r0, 0x1 - strb r0, [r1] - bl sub_8049ED4 - movs r7, 0x1 -_0805EF00: - ldrb r0, [r6, 0x1] - cmp r0, 0 - beq _0805EF18 - cmp r0, 0x1 - beq _0805EF52 - cmp r0, 0x2 - bne _0805EF12 - movs r1, 0x1 - mov r8, r1 -_0805EF12: - mov r0, r8 - cmp r0, 0 - beq _0805EF52 -_0805EF18: - cmp r7, 0 - bne _0805EF52 - adds r1, r5, 0x4 - adds r0, r5, 0 - movs r2, 0 - movs r3, 0x1 - bl sub_807FE9C - b _0805EF52 -_0805EF2A: - adds r0, r4, 0 - bl GetItemData - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - bne _0805EF44 - adds r0, r5, 0x4 - movs r1, 0x1 - bl sub_8045DB4 - b _0805EF52 -_0805EF44: - ldr r0, _0805EF5C - ldr r0, [r0] - movs r1, 0xB8 - lsls r1, 3 - adds r0, r1 - movs r1, 0x4 - str r1, [r0] -_0805EF52: - pop {r3} - mov r8, r3 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_0805EF5C: .4byte gDungeon - thumb_func_end sub_805EE30 - thumb_func_start sub_805EF60 sub_805EF60: push {r4-r6,lr} diff --git a/src/code_805D8C8_1.c b/src/code_805D8C8_1.c index 60ca0a3fe..32e0ec703 100644 --- a/src/code_805D8C8_1.c +++ b/src/code_805D8C8_1.c @@ -6,16 +6,29 @@ #include "code_80521D0.h" #include "dungeon_action.h" #include "dungeon_ai_targeting.h" +#include "dungeon_pokemon_attributes.h" #include "dungeon_util.h" +#include "trap.h" +#include "charge_move.h" #include "dungeon_map_access.h" #include "game_options.h" +#include "dungeon_items.h" #include "dungeon_leader.h" +#include "tile_types.h" #include "dungeon_visibility.h" +#include "dungeon_movement.h" #include "bg_control.h" #include "items.h" #include "code_806CD90.h" #include "dungeon_capabilities.h" +#include "constants/dungeon.h" +#include "constants/status.h" +#include "constants/iq_skill.h" +#include "constants/dungeon_action.h" +extern void sub_807FE9C(Entity *pokemon, Position *pos, int param_3, char param_4); +extern void sub_8045DB4(Position *, u32); +extern s32 sub_8052B8C(u32, const u8 *, u32); void sub_806A2BC(Entity *a0, u8 a1); bool8 sub_805E874(void); bool8 sub_80701A4(Entity *a0); @@ -24,6 +37,7 @@ void sub_805E738(Entity *a0); void sub_803E708(s32 a0, s32 a1); void sub_8040A78(void); void sub_805E804(void); +void sub_8049ED4(void); void sub_8075680(u32); void sub_8094C88(void); void sub_8040A84(void); @@ -39,7 +53,7 @@ void sub_805E2C4(Entity *leader); bool8 sub_8094C48(void); void sub_8052210(u8 a0); void sub_803E46C(s32 a0); -bool8 sub_805EC4C(Entity *a0, u16 a1); +bool8 sub_805EC4C(Entity *a0, u8 a1); void sub_803E724(s32 a0); void HandleTalkFieldAction(Entity *); bool8 sub_8044B28(void); @@ -47,6 +61,7 @@ bool8 IsNotAttacking(Entity *param_1, bool8 param_2); void ShowFieldMenu(u8 a0, u8 a1); bool8 sub_805EF60(Entity *a0, EntityInfo *a1); s32 GetTeamMemberEntityIndex(Entity *pokemon); +bool8 sub_8070F80(Entity * pokemon, s32 direction); extern u8 gUnknown_202F22D; extern u8 gUnknown_202F22C; @@ -63,6 +78,7 @@ extern const u8 *gUnknown_80F8B0C; extern const u8 *gUnknown_80FD4B0; extern const u8 *gUnknown_80F8A4C; extern const u8 *gUnknown_80F8A28; +extern const u8 *gUnknown_8100208; #ifdef NONMATCHING @@ -2525,3 +2541,147 @@ bool8 sub_805E874(void) return TRUE; } + +bool8 sub_805EC2C(Entity *a0, s32 x, s32 y) +{ + Position pos = {.x = x, .y = 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; + Tile *tile; + EntityInfo *tileMonsterInfo; + Entity *tileMonster; + EntityInfo *entityInfo = a0->info; + + pos.x = a0->pos.x + gAdjacentTileOffsets[entityInfo->action.direction].x; + pos.y = a0->pos.y + gAdjacentTileOffsets[entityInfo->action.direction].y; + tile = GetTile(pos.x, pos.y); + tileMonster = tile->monster; + + if (tileMonster == NULL) return FALSE; + if (GetEntityType(tileMonster) != ENTITY_MONSTER) return FALSE; + + tileMonsterInfo = tileMonster->info; + if (tileMonsterInfo->isNotTeamMember + && (tileMonsterInfo->shopkeeper != 1 && tileMonsterInfo->shopkeeper != 2) + && !IsClientOrTeamBase(tileMonsterInfo->joinedAt.joinedAt) + && tileMonsterInfo->clientType != 1) { + return FALSE; + } + + if (entityInfo->immobilize.immobilizeStatus == STATUS_SHADOW_HOLD) return FALSE; + if (entityInfo->immobilize.immobilizeStatus == STATUS_FROZEN) return FALSE; + if (entityInfo->immobilize.immobilizeStatus == STATUS_CONSTRICTION) return FALSE; + if (entityInfo->immobilize.immobilizeStatus == STATUS_INGRAIN) return FALSE; + if (entityInfo->immobilize.immobilizeStatus == STATUS_WRAP) return FALSE; + if (entityInfo->immobilize.immobilizeStatus == STATUS_WRAPPED) return FALSE; + + if (tileMonsterInfo->immobilize.immobilizeStatus == STATUS_SHADOW_HOLD) return FALSE; + if (tileMonsterInfo->immobilize.immobilizeStatus == STATUS_FROZEN) return FALSE; + if (tileMonsterInfo->immobilize.immobilizeStatus == STATUS_CONSTRICTION) return FALSE; + if (tileMonsterInfo->immobilize.immobilizeStatus == STATUS_INGRAIN) return FALSE; + if (tileMonsterInfo->immobilize.immobilizeStatus == STATUS_WRAP) return FALSE; + if (tileMonsterInfo->immobilize.immobilizeStatus == STATUS_WRAPPED) return FALSE; + + if (entityInfo->volatileStatus.volatileStatus == STATUS_CONFUSED) return FALSE; + if (tileMonsterInfo->volatileStatus.volatileStatus == STATUS_CONFUSED) return FALSE; + + if (tileMonsterInfo->sleep.sleep != STATUS_NONE && tileMonsterInfo->sleep.sleep != STATUS_SLEEPLESS && tileMonsterInfo->sleep.sleep != STATUS_YAWNING) return FALSE; + if (entityInfo->sleep.sleep != STATUS_NONE && entityInfo->sleep.sleep != STATUS_SLEEPLESS && entityInfo->sleep.sleep != STATUS_YAWNING) return FALSE; + + if (IsCharging(tileMonster, FALSE)) return FALSE; + if (!sub_8070F80(a0, entityInfo->action.direction)) return FALSE; + + if (a1 != 0 && sub_807049C(tileMonster, &a0->pos) && !sub_8052B8C(0, gUnknown_8100208, 0)) return FALSE; + + SetMonsterActionFields(&entityInfo->action, ACTION_WALK); + if (gRealInputs.held & B_BUTTON) { + entityInfo->action.unk4[0].actionUseIndex = 0; + } + else { + entityInfo->action.unk4[0].actionUseIndex = 1; + } + entityInfo->flags |= 0x8000; + + SetMonsterActionFields(&tileMonsterInfo->action, ACTION_WALK); + tileMonsterInfo->action.unk4[0].actionUseIndex = 0; + tileMonsterInfo->action.direction = (entityInfo->action.direction + 4) & 7; + tileMonsterInfo->flags |= 0x8000; + tileMonsterInfo->targetPos.x = tileMonster->pos.x; + tileMonsterInfo->targetPos.y = tileMonster->pos.y; + gDungeon->unkE = 1; + return TRUE; +} + +void sub_805EE30(void) +{ + Entity *tileObject; + Tile *tile; + Entity *leader = GetLeader(); + if (leader == NULL) + return; + if (sub_8044B28()) + return; + + tile = GetTileAtEntitySafe(leader); + if (IQSkillIsEnabled(leader, IQ_SUPER_MOBILE) && leader->info->transformStatus.transformStatus != STATUS_MOBILE && !HasHeldItem(leader, ITEM_MOBILE_SCARF)) + sub_804AE84(&leader->pos); + if (tile->terrainType & TERRAIN_TYPE_STAIRS) + gDungeon->unk1 = 1; + + tileObject = tile->object; + if (tileObject == NULL) + return; + switch (GetEntityType(tileObject)) + { + case ENTITY_TRAP: { + Trap *trap = GetTrapData(tileObject); + bool32 r8 = FALSE; + bool32 r7 = FALSE; + if (IQSkillIsEnabled(leader, IQ_TRAP_SEER) && !tileObject->isVisible) { + tileObject->isVisible = TRUE; + sub_8049ED4(); + r7 = TRUE; + } + if (trap->unk1 != 0) { + if (trap->unk1 == 1) + break; + if (trap->unk1 == 2) + r8 = TRUE; + if (r8 == FALSE) + break; + } + if (!r7) { + sub_807FE9C(leader, &leader->pos, 0, 1); + } + } + break; + case ENTITY_ITEM: { + Item *item = GetItemData(tileObject); + if (!(item->flags & ITEM_FLAG_IN_SHOP)) { + sub_8045DB4(&leader->pos, 1); + } + else { + gDungeon->unk5C0 = 4; + } + } + break; + case ENTITY_NOTHING: + case ENTITY_MONSTER: + case ENTITY_UNK_4: + case ENTITY_UNK_5: + default: + break; + } +}