From fb6ce356c2832ac50bccf322ab02fc789cbcfcd3 Mon Sep 17 00:00:00 2001 From: Seth Barberee Date: Fri, 20 Jan 2023 14:21:44 -0800 Subject: [PATCH] matched sub_804A85C with some help from @jiangzhengwenjz --- asm/code_8057824_1.s | 297 ------------------------------------------- src/code_805A120.c | 121 ++++++++++++++++++ 2 files changed, 121 insertions(+), 297 deletions(-) diff --git a/asm/code_8057824_1.s b/asm/code_8057824_1.s index 53ed07c1a..f52d05779 100644 --- a/asm/code_8057824_1.s +++ b/asm/code_8057824_1.s @@ -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} diff --git a/src/code_805A120.c b/src/code_805A120.c index c50d906b3..7837e56e4 100644 --- a/src/code_805A120.c +++ b/src/code_805A120.c @@ -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; +}