matched sub_804A85C with some help from @jiangzhengwenjz

This commit is contained in:
Seth Barberee 2023-01-20 14:21:44 -08:00
parent 9291137a68
commit fb6ce356c2
2 changed files with 121 additions and 297 deletions

View File

@ -5,303 +5,6 @@
.text
thumb_func_start sub_805A85C
sub_805A85C:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x30
mov r8, r0
adds r6, r1, 0
mov r10, r2
str r3, [sp, 0x24]
ldr r0, [r6, 0x4]
str r0, [sp, 0x18]
adds r0, r6, 0
movs r1, 0xA
movs r2, 0x8
bl sub_806CDD4
movs r5, 0
_0805A880:
movs r0, 0x3
bl DungeonRandInt
adds r4, r0, 0
movs r0, 0x3
bl DungeonRandInt
adds r2, r0, 0
subs r4, 0x1
subs r2, 0x1
cmp r4, 0
bne _0805A89C
cmp r2, 0
beq _0805A8BC
_0805A89C:
ldrh r0, [r6, 0x4]
adds r0, r4
lsls r0, 16
ldrh r1, [r6, 0x6]
adds r1, r2
lsls r1, 16
lsrs r0, 16
orrs r0, r1
str r0, [sp, 0x18]
adds r0, r6, 0
add r1, sp, 0x18
bl sub_80705F0
lsls r0, 24
cmp r0, 0
beq _0805A8C2
_0805A8BC:
adds r5, 0x1
cmp r5, 0x27
ble _0805A880
_0805A8C2:
cmp r5, 0x28
bne _0805A8DC
ldr r0, _0805A8D8
ldr r2, [r0]
mov r0, r8
adds r1, r6, 0
bl sub_80522F4
movs r0, 0
b _0805AAB8
.align 2, 0
_0805A8D8: .4byte gUnknown_80FEBDC
_0805A8DC:
add r0, sp, 0x18
movs r2, 0
ldrsh r1, [r0, r2]
lsls r0, r1, 1
adds r0, r1
lsls r0, 11
movs r3, 0xC0
lsls r3, 4
adds r0, r3
ldr r1, [r6, 0xC]
subs r0, r1
movs r1, 0xC
bl __divsi3
str r0, [sp, 0x28]
add r0, sp, 0x18
movs r2, 0x2
ldrsh r1, [r0, r2]
lsls r0, r1, 1
adds r0, r1
lsls r0, 11
movs r3, 0x80
lsls r3, 5
adds r0, r3
ldr r1, [r6, 0x10]
subs r0, r1
movs r1, 0xC
bl __divsi3
str r0, [sp, 0x2C]
adds r4, r6, 0x4
adds r0, r4, 0
bl sub_803F428
lsls r0, 24
mov r9, r4
cmp r0, 0
bne _0805A934
add r0, sp, 0x18
bl sub_803F428
lsls r0, 24
cmp r0, 0
beq _0805A94C
_0805A934:
movs r5, 0xB
_0805A936:
adds r0, r6, 0
ldr r1, [sp, 0x28]
ldr r2, [sp, 0x2C]
bl sub_804539C
movs r0, 0x2C
bl sub_803E46C
subs r5, 0x1
cmp r5, 0
bge _0805A936
_0805A94C:
add r0, sp, 0x18
movs r1, 0
ldrsh r0, [r0, r1]
add r4, sp, 0x18
movs r2, 0x2
ldrsh r1, [r4, r2]
bl GetTileSafe
ldr r5, [r0, 0x10]
cmp r5, 0
beq _0805AA4C
adds r0, r5, 0
bl GetEntityType
adds r7, r0, 0
cmp r7, 0x1
bne _0805A9FE
add r4, sp, 0x1C
ldr r1, _0805AA44
adds r0, r4, 0
bl InitPokemonMove
adds r0, r5, 0
adds r1, r4, 0
bl sub_80571F0
lsls r0, 24
lsrs r4, r0, 24
cmp r4, 0
bne _0805A9B0
mov r0, r10
ldr r1, [sp, 0x24]
bl sub_8057600
lsls r0, 16
asrs r0, 16
ldr r1, _0805AA48
movs r3, 0
ldrsh r2, [r1, r3]
str r4, [sp]
str r4, [sp, 0x4]
str r0, [sp, 0x8]
str r4, [sp, 0xC]
str r7, [sp, 0x10]
str r4, [sp, 0x14]
mov r0, r8
adds r1, r5, 0
movs r3, 0
bl sub_806F370
_0805A9B0:
bl sub_8044B28
lsls r0, 24
lsrs r4, r0, 24
cmp r4, 0
bne _0805AAB6
mov r0, r8
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _0805AAB6
ldr r0, _0805AA48
movs r1, 0
ldrsh r2, [r0, r1]
str r4, [sp]
str r4, [sp, 0x4]
movs r0, 0xFF
lsls r0, 1
str r0, [sp, 0x8]
str r4, [sp, 0xC]
str r4, [sp, 0x10]
str r4, [sp, 0x14]
mov r0, r8
mov r1, r8
movs r3, 0
bl sub_806F370
bl sub_8044B28
lsls r0, 24
cmp r0, 0
bne _0805AAB6
mov r0, r8
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _0805AAB6
_0805A9FE:
adds r0, r6, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _0805AAB6
mov r0, r9
bl sub_803F428
lsls r0, 24
cmp r0, 0
bne _0805AA22
add r0, sp, 0x18
bl sub_803F428
lsls r0, 24
cmp r0, 0
beq _0805AA5E
_0805AA22:
ldr r2, [sp, 0x28]
negs r7, r2
ldr r3, [sp, 0x2C]
negs r4, r3
movs r5, 0xB
_0805AA2C:
adds r0, r6, 0
adds r1, r7, 0
adds r2, r4, 0
bl sub_804539C
movs r0, 0x2C
bl sub_803E46C
subs r5, 0x1
cmp r5, 0
bge _0805AA2C
b _0805AA5E
.align 2, 0
_0805AA44: .4byte 0x00000163
_0805AA48: .4byte gUnknown_80F4F82
_0805AA4C:
add r0, sp, 0x18
movs r2, 0
ldrsh r1, [r0, r2]
movs r3, 0x2
ldrsh r2, [r4, r3]
adds r0, r6, 0
movs r3, 0
bl sub_80694C0
_0805AA5E:
adds r0, r6, 0
bl EntityExists
lsls r0, 24
cmp r0, 0
beq _0805AAB6
adds r0, r6, 0
movs r1, 0
bl sub_804535C
mov r1, r9
adds r0, r6, 0
bl sub_80706A4
lsls r0, 24
cmp r0, 0
beq _0805AA8C
mov r0, r8
adds r1, r6, 0
movs r2, 0
movs r3, 0
bl sub_807D148
_0805AA8C:
ldr r0, [r6, 0x70]
ldrb r0, [r0, 0x7]
cmp r0, 0
beq _0805AAA0
mov r0, r9
bl sub_804AC20
movs r0, 0
bl sub_807EC28
_0805AAA0:
adds r0, r6, 0
bl sub_806A5B8
ldr r0, _0805AAC8
ldr r0, [r0]
ldr r1, _0805AACC
adds r0, r1
ldrb r1, [r0]
adds r0, r6, 0
bl sub_8075900
_0805AAB6:
movs r0, 0x1
_0805AAB8:
add sp, 0x30
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_0805AAC8: .4byte gDungeon
_0805AACC: .4byte 0x00003a08
thumb_func_end sub_805A85C
thumb_func_start sub_805AAD0
sub_805AAD0:
push {lr}

View File

@ -6,8 +6,11 @@
#include "dungeon_global_data.h"
#include "dungeon_pokemon_attributes.h"
#include "dungeon_items.h"
#include "dungeon_map_access.h"
#include "dungeon_random.h"
#include "dungeon_util.h"
#include "item.h"
#include "moves.h"
#include "move_effects_target.h"
#include "status.h"
#include "status_actions.h"
@ -40,7 +43,24 @@ extern u8 *gUnknown_80FD170[];
extern u8 *gUnknown_80FCCE8[];
extern u8 *gUnknown_80FD18C[];
extern u8 *gUnknown_80FD57C[];
extern s16 gUnknown_80F4F82;
extern u8 *gUnknown_80FEBDC[];
extern s16 sub_8057600(struct Move*, u32);
extern void sub_806CDD4(struct Entity *, u32, u32);
extern bool8 sub_80705F0(struct Entity *pokemon, struct Position *pos);
extern u8 sub_8044B28(void);
extern u8 sub_803F428(struct Position *pos);
extern void sub_804539C(struct Entity *, u32, u32);
extern void sub_803E46C(u32);
bool8 sub_80571F0(struct Entity * pokemon, struct Move *move);
extern void sub_807EC28(u32);
extern void sub_806F370(struct Entity *r0, struct Entity *r1, u32, u32, u8 *, u8, s32, u32, u32, u32);
void sub_8075900(struct Entity *pokemon, u8 r1);
extern void sub_804535C(struct Entity *, u32);
extern void sub_804AC20(struct Position *);
extern void sub_806A5B8(struct Entity *entity);
extern void sub_80694C0(struct Entity *, s32, s32, u32);
bool8 sub_80706A4(struct Entity *pokemon, struct Position *pos);
extern void sub_807D148(struct Entity *pokemon, struct Entity *target, u32 r2, struct Position *r3);
extern void SetMessageArgument(u8 *buffer, struct Entity *r1, u32);
@ -468,3 +488,104 @@ void sub_805A7D4(struct Entity * pokemon, struct Entity * target, struct Item *i
SetMessageArgument(gUnknown_202DE58,&stackEntity,0);
sub_804652C(pokemon,&stackEntity,item,1,0);
}
bool8 sub_805A85C(struct Entity * pokemon, struct Entity * target, struct Move *move, u32 param_4)
{
int r4;
int r2;
int r5;
struct Position *r9;
struct Position sp_0x18;
struct Move sp_0x1C;
struct Position32 sp_0x28;
struct Tile *tile;
struct Entity *entity;
s32 temp;
s32 temp2;
u8 check;
sp_0x18 = target->pos;
sub_806CDD4(target,10,8);
for(r5 = 0; r5 < 0x28; r5++)
{
r4 = DungeonRandInt(3);
r2 = DungeonRandInt(3);
r4--;
r2--;
if ((r4 != 0) || (r2 != 0)) {
sp_0x18.x = target->pos.x + r4;
sp_0x18.y = target->pos.y + r2;
if (sub_80705F0(target,&sp_0x18) == 0) goto _0805A8C2;
}
}
_0805A8C2:
if (r5 == 0x28) {
sub_80522F4(pokemon,target,*gUnknown_80FEBDC);
return FALSE;
}
temp = sp_0x18.x * 0x1800;
temp += (0xC00);
sp_0x28.x = (temp - target->pixelPos.x) / 0xc;
temp2 = sp_0x18.y * 0x1800;
temp2 += (0x80 << 5);
sp_0x28.y = ((temp2 - target->pixelPos.y) / 0xc);
if (((check = sub_803F428(&target->pos), r9 = &target->pos, check != 0)) || (sub_803F428(&sp_0x18) != 0)) {
for(r5 = 0; r5 < 0xC; r5++)
{
sub_804539C(target,sp_0x28.x,sp_0x28.y);
sub_803E46C(0x2c);
}
}
tile = GetTileSafe(sp_0x18.x,sp_0x18.y);
entity = tile->monster;
if (entity != 0) {
if (GetEntityType(entity) == 1) {
InitPokemonMove(&sp_0x1C,0x163);
if (sub_80571F0(entity,&sp_0x1C) == 0) {
sub_806F370(pokemon,entity,gUnknown_80F4F82,0,0,0,sub_8057600(move, param_4),0,1,0);
}
if ((sub_8044B28() == 0) && (EntityExists(pokemon))) {
sub_806F370(pokemon,pokemon,gUnknown_80F4F82,0,0,0,0x1fe,0,0,0);
if ((sub_8044B28() == 0) && (EntityExists(pokemon))) goto _0805A9FE;
}
}
else {
_0805A9FE:
if (EntityExists(target)) {
if ((sub_803F428(r9) != 0) || (sub_803F428(&sp_0x18) != 0)) {
for(r5 = 0; r5 < 0xC; r5++)
{
sub_804539C(target, -sp_0x28.x,-sp_0x28.y);
sub_803E46C(0x2c);
}
}
goto _0805AA5E;
}
}
}
else
{
sub_80694C0(target,sp_0x18.x,sp_0x18.y,0);
_0805AA5E:
if (EntityExists(target)) {
register struct Position *pos asm("r1");
sub_804535C(target, 0);
pos = r9;
if (sub_80706A4(target, pos) != 0) {
sub_807D148(pokemon,target,0,0);
}
if (target->info->isTeamLeader) {
sub_804AC20(r9);
sub_807EC28(0);
}
sub_806A5B8(target);
sub_8075900(target,gDungeon->unk3A08);
}
}
return TRUE;
}