mirror of
https://github.com/pret/pmd-red.git
synced 2026-06-02 22:09:45 -05:00
matched sub_804A85C with some help from @jiangzhengwenjz
This commit is contained in:
parent
9291137a68
commit
fb6ce356c2
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user