sub_805EE30

This commit is contained in:
DizzyEggg 2024-07-21 22:01:24 +02:00
parent c79dc3e37b
commit becf24b4ec
2 changed files with 161 additions and 415 deletions

View File

@ -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}

View File

@ -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;
}
}