From 7141bae241b554f8135b6120fa18da89acc6054a Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Wed, 9 Oct 2024 14:04:10 +0200 Subject: [PATCH] sub_8042B34 --- asm/code_8042B34.s | 195 ----------------------------------------- include/code_800DAC0.h | 20 ++++- ld_script.txt | 1 + src/code_8041AD0.c | 20 +---- src/code_8042B34.c | 83 ++++++++++++++++++ src/code_8085E98.c | 26 +----- src/code_80861A8.c | 31 ++----- 7 files changed, 114 insertions(+), 262 deletions(-) create mode 100644 src/code_8042B34.c diff --git a/asm/code_8042B34.s b/asm/code_8042B34.s index a24674e01..8b031986b 100644 --- a/asm/code_8042B34.s +++ b/asm/code_8042B34.s @@ -5,201 +5,6 @@ .text - thumb_func_start sub_8042B34 -sub_8042B34: - push {r4-r7,lr} - mov r7, r10 - mov r6, r9 - mov r5, r8 - push {r5-r7} - sub sp, 0x28 - adds r5, r0, 0 - adds r4, r1, 0 - adds r6, r2, 0 - movs r0, 0 - mov r8, r0 - bl xxx_call_GetLeader - mov r10, r0 - ldr r7, _08042CB0 - movs r0, 0xCC - movs r1, 0x7 - bl MemoryAlloc - str r0, [r7] - str r5, [r0] - adds r4, 0x1 - lsls r4, 2 - str r4, [r0, 0x8] - ldr r4, _08042CB4 - lsls r0, r5, 1 - adds r0, r5 - lsls r0, 3 - adds r0, r4 - movs r1, 0 - ldrsh r0, [r0, r1] - bl sub_800EE5C - bl sub_800EF64 - movs r0, 0x46 - bl sub_803E46C - ldr r0, [r7] - str r6, [r0, 0x4] - movs r5, 0 - ldr r0, [r0, 0x8] - cmp r5, r0 - blt _08042B8E - b _08042C9E -_08042B8E: - mov r9, sp -_08042B90: - mov r2, r8 - lsls r6, r2, 3 - ldr r0, [r7] - ldr r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 3 - adds r0, r6, r0 - ldr r3, _08042CB4 - adds r0, r3 - movs r1, 0 - ldrsh r0, [r0, r1] - str r0, [sp] - str r5, [sp, 0x4] - movs r0, 0 - str r0, [sp, 0x8] - mov r2, r10 - ldr r0, [r2, 0xC] - cmp r0, 0 - bge _08042BBA - adds r0, 0xFF -_08042BBA: - asrs r0, 8 - mov r3, r9 - strh r0, [r3, 0xC] - mov r1, sp - mov r2, r10 - ldr r0, [r2, 0x10] - cmp r0, 0 - bge _08042BCC - adds r0, 0xFF -_08042BCC: - asrs r0, 8 - strh r0, [r1, 0xE] - movs r0, 0x2 - bl RandInt - ldr r1, [r7] - lsls r4, r5, 2 - adds r3, r1, 0 - adds r3, 0x4C - adds r3, r4 - ldr r2, [r1] - lsls r1, r2, 1 - adds r1, r2 - lsls r1, 3 - adds r1, r6, r1 - ldr r2, _08042CB4 - adds r2, 0x4 - adds r1, r2 - ldr r1, [r1] - lsls r1, 1 - adds r1, r0 - str r1, [r3] - movs r0, 0xF0 - bl RandInt - ldr r1, [r7] - adds r1, r4 - adds r0, 0x98 - adds r1, 0x8C - strh r0, [r1] - lsls r0, r5, 1 - adds r0, 0x8 - bl RandInt - ldr r1, [r7] - adds r2, r1, r4 - adds r3, r0, 0 - adds r3, 0x18 - adds r1, r5, 0 - cmp r5, 0 - bge _08042C20 - adds r1, r5, 0x3 -_08042C20: - asrs r1, 2 - lsls r1, 2 - subs r1, r5, r1 - lsls r0, r1, 2 - adds r0, r1 - lsls r0, 3 - subs r0, r3, r0 - adds r1, r2, 0 - adds r1, 0x8E - strh r0, [r1] - adds r0, r2, 0 - adds r0, 0x8C - ldrh r0, [r0] - mov r3, r9 - strh r0, [r3, 0x10] - ldrh r0, [r1] - strh r0, [r3, 0x12] - movs r0, 0x4 - str r0, [sp, 0x14] - ldr r0, _08042CB8 - str r0, [sp, 0x18] - add r1, sp, 0x1C - ldr r0, _08042CBC - ldm r0!, {r2,r3,r6} - stm r1!, {r2,r3,r6} - mov r0, sp - bl sub_800E890 - ldr r2, [r7] - adds r1, r2, 0 - adds r1, 0xC - adds r1, r4 - str r0, [r1] - movs r6, 0x1 - add r8, r6 - mov r0, r8 - cmp r0, 0x2 - bgt _08042C82 - ldr r0, [r2] - lsls r1, r0, 1 - adds r1, r0 - add r1, r8 - lsls r1, 3 - ldr r2, _08042CB4 - adds r1, r2 - movs r3, 0 - ldrsh r0, [r1, r3] - cmp r0, 0 - bne _08042C86 -_08042C82: - movs r6, 0 - mov r8, r6 -_08042C86: - ldr r0, [sp] - bl sub_800ECA4 - ldr r0, [r0, 0x4] - bl sub_800F15C - adds r5, 0x1 - ldr r0, [r7] - ldr r0, [r0, 0x8] - cmp r5, r0 - bge _08042C9E - b _08042B90 -_08042C9E: - add sp, 0x28 - pop {r3-r5} - mov r8, r3 - mov r9, r4 - mov r10, r5 - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_08042CB0: .4byte gUnknown_203B414 -_08042CB4: .4byte gUnknown_80F6624 -_08042CB8: .4byte 0x0000ffff -_08042CBC: .4byte gUnknown_80F683C - thumb_func_end sub_8042B34 - thumb_func_start sub_8042CC0 sub_8042CC0: push {r4-r7,lr} diff --git a/include/code_800DAC0.h b/include/code_800DAC0.h index 66d71d80c..1495db5c8 100644 --- a/include/code_800DAC0.h +++ b/include/code_800DAC0.h @@ -1,7 +1,25 @@ #ifndef GUARD_CODE_800DAC0_H #define GUARD_CODE_800DAC0_H +#include "ground_sprite.h" + +typedef struct unkStruct_80416E0 +{ + s32 unk0; + s32 unk4; + s32 unk8; + u16 x; + u16 y; + u16 unk10; + u16 unk12; + s32 unk14; + u32 unk18; + unkStruct_2039DB0 unk1C; +} unkStruct_80416E0; + +u32 sub_800E890(unkStruct_80416E0 *); + void sub_800DAC0(u32); void sub_800DB7C(void); -#endif // GUARD_CODE_800DAC0_H \ No newline at end of file +#endif // GUARD_CODE_800DAC0_H diff --git a/ld_script.txt b/ld_script.txt index cad5fe6e7..1be5385d9 100755 --- a/ld_script.txt +++ b/ld_script.txt @@ -214,6 +214,7 @@ SECTIONS { src/code_8041AD0.o(.text); asm/code_8041AD0.o(.text); src/code_804267C.o(.text); + src/code_8042B34.o(.text); asm/code_8042B34.o(.text); src/dungeon_engine.o(.text); asm/code_8044210.o(.text); diff --git a/src/code_8041AD0.c b/src/code_8041AD0.c index 7e57bc8f5..99624e3d9 100644 --- a/src/code_8041AD0.c +++ b/src/code_8041AD0.c @@ -4,6 +4,7 @@ #include "code_804267C.h" #include "code_806CD90.h" #include "code_8041AD0.h" +#include "code_800DAC0.h" #include "type_chart.h" #include "constants/direction.h" #include "constants/status.h" @@ -14,21 +15,6 @@ #include "structs/dungeon_entity.h" #include "structs/str_dungeon.h" -// size: 0x1C -typedef struct unkStruct_80416E0 -{ - s32 unk0; - s32 unk4; - s32 unk8; - u16 x; - u16 y; - u16 unk10; - u16 unk12; - s32 unk14; - u32 unk18; -} unkStruct_80416E0; - - extern u32 gStatusSpriteMasks_SleepStatus[]; extern u32 gStatusSpriteMasks_NonVolatileStatus[]; extern u32 gStatusSpriteMasks_ImmobilizeStatus[]; @@ -63,7 +49,6 @@ extern void sub_803EA10(void); extern void sub_8042E98(void); extern void sub_800EE5C(u32); extern void sub_800EF64(void); -extern u32 sub_800E890(unkStruct_80416E0 *); u32 sub_8041764(unkStruct_80416E0 *param_1, bool8 param_2); s32 sub_80416E0(Position32 *pos, u32 param_2, bool8 param_3); @@ -82,7 +67,6 @@ s32 sub_80416E0(Position32 *pos, u32 param_2, bool8 param_3) int counter; s32 ret; unkStruct_80416E0 auStack_10; - unkStruct_2039DB0 auStack_18; // Size: 0xC auStack_10.unk0 = param_2; auStack_10.unk4 = 0; @@ -95,7 +79,7 @@ s32 sub_80416E0(Position32 *pos, u32 param_2, bool8 param_3) auStack_10.unk10 = 0; auStack_10.unk12 = 0; auStack_10.unk18 = 0xffff; - sub_8004E8C(&auStack_18); + sub_8004E8C(&auStack_10.unk1C); ret = sub_8041764(&auStack_10, FALSE); if (param_3) { counter = 0; diff --git a/src/code_8042B34.c b/src/code_8042B34.c new file mode 100644 index 000000000..dfe953643 --- /dev/null +++ b/src/code_8042B34.c @@ -0,0 +1,83 @@ +#include "global.h" +#include "dungeon_util_1.h" +#include "memory.h" +#include "code_803E46C.h" +#include "code_800E9E4.h" +#include "code_800DAC0.h" +#include "random.h" + +extern void sub_800EE5C(s32); +extern void sub_800EF64(void); +extern void sub_800F15C(s32); + +struct Sub_UnkStruct_203B414 +{ + s16 a0; + s16 a2; +}; + +struct UnkStruct_203B414 +{ + s32 unk0; + s32 unk4; + s32 unk8; + s32 unkC[16]; + s32 unk4C[16]; + struct Sub_UnkStruct_203B414 unk8C[16]; +}; + +extern struct UnkStruct_203B414 *gUnknown_203B414; + +struct UnkStruct_80F6624 +{ + s16 unk0; + s32 unk4; +}; + +extern const struct UnkStruct_80F6624 gUnknown_80F6624[][3]; + +extern const unkStruct_2039DB0 gUnknown_80F683C; + +void sub_8042B34(s32 a0, s32 a1, s32 a2) +{ + unkStruct_80416E0 spStruct; + s32 i; + s32 r8 = 0; + Entity *leader = xxx_call_GetLeader(); + gUnknown_203B414 = MemoryAlloc(sizeof(*gUnknown_203B414), 7); + + gUnknown_203B414->unk0 = a0; + gUnknown_203B414->unk8 = (a1 + 1) * 4; + sub_800EE5C(gUnknown_80F6624[a0][0].unk0); + sub_800EF64(); + sub_803E46C(0x46); + gUnknown_203B414->unk4 = a2; + for (i = 0; i < gUnknown_203B414->unk8; i++) { + s32 rnd; + + spStruct.unk0 = gUnknown_80F6624[gUnknown_203B414->unk0][r8].unk0; + spStruct.unk4 = i; + spStruct.unk8 = 0; + spStruct.x = leader->pixelPos.x / 256; + spStruct.y = leader->pixelPos.y / 256; + + rnd = RandInt(2); + gUnknown_203B414->unk4C[i] = (gUnknown_80F6624[gUnknown_203B414->unk0][r8].unk4 * 2) + rnd; + gUnknown_203B414->unk8C[i].a0 = RandInt(240) + 152; + gUnknown_203B414->unk8C[i].a2 = RandInt(8 + (i * 2)) - (((i - (i / 4 * 4)) * 40) - 24); + + spStruct.unk10 = gUnknown_203B414->unk8C[i].a0; + spStruct.unk12 = gUnknown_203B414->unk8C[i].a2; + spStruct.unk14 = 4; + spStruct.unk18 = 0xFFFF; + spStruct.unk1C = gUnknown_80F683C; + gUnknown_203B414->unkC[i] = sub_800E890(&spStruct); + + r8++; + if (r8 >= 3 || gUnknown_80F6624[gUnknown_203B414->unk0][r8].unk0 == 0) { + r8 = 0; + } + + sub_800F15C(sub_800ECA4(spStruct.unk0)->unk4); + } +} diff --git a/src/code_8085E98.c b/src/code_8085E98.c index acf8d936c..68b642a1e 100644 --- a/src/code_8085E98.c +++ b/src/code_8085E98.c @@ -4,31 +4,13 @@ #include "code_803E46C.h" #include "dungeon_util.h" #include "items.h" +#include "code_800DAC0.h" #include "structs/str_dungeon.h" -struct unkStruct_80420E8 -{ - u32 unk0; - u32 unk4; - u32 unk8; -}; -extern const struct unkStruct_80420E8 gUnknown_8107374; +extern const unkStruct_2039DB0 gUnknown_8107374; -typedef struct unkStruct_80416E0 -{ - s32 unk0; - s32 unk4; - s32 unk8; - u16 x; - u16 y; - u16 unk10; - u16 unk12; - s32 unk14; - u32 unk18; -} unkStruct_80416E0; -extern u32 sub_800E890(unkStruct_80416E0 *); void sub_800EF64(void); void sub_800EE5C(s32); void sub_8085F44(s32); @@ -52,7 +34,6 @@ u32 sub_8085EC8(s16 param_1,u32 param_2,u32 param_3,Position *param_4,bool32 par { u32 uVar1; unkStruct_80416E0 local_40; - struct unkStruct_80420E8 local; bool8 param_5_bool8; s32 param_1_s32 = param_1; @@ -71,8 +52,7 @@ u32 sub_8085EC8(s16 param_1,u32 param_2,u32 param_3,Position *param_4,bool32 par local_40.unk10 = 0; local_40.unk12 = 0; local_40.unk18 = 0xffff; - local = gUnknown_8107374; - + local_40.unk1C = gUnknown_8107374; uVar1 = sub_800E890(&local_40); if (param_5_bool8) { diff --git a/src/code_80861A8.c b/src/code_80861A8.c index 115c55b2e..703b0e647 100644 --- a/src/code_80861A8.c +++ b/src/code_80861A8.c @@ -1,30 +1,12 @@ #include "global.h" #include "constants/direction.h" #include "code_80861A8.h" - +#include "code_800DAC0.h" #include "code_803E668.h" #include "code_806CD90.h" #include "dungeon_music.h" -typedef struct unkStruct_80416E0 -{ - s32 unk0; - s32 unk4; - s32 unk8; - u16 x; - u16 y; - u16 unk10; - u16 unk12; - s32 unk14; - u32 unk18; -} unkStruct_80416E0; -extern s32 sub_800E890(unkStruct_80416E0 *); - -struct unkStruct_8107380 -{ - u8 unk0[12]; -}; -extern struct unkStruct_8107380 gUnknown_8107380; +extern const unkStruct_2039DB0 gUnknown_8107380; extern const u8 *gUnknown_810665C[]; extern const u8 *gUnknown_810668C[]; @@ -41,7 +23,7 @@ s32 sub_800E700(s32); void sub_800569C(Position *, EntitySpriteInfo *, u8); void sub_8085F44(void); -void sub_8052FB8(const u8 *); +void sub_8052FB8(const u8 *); void sub_8086124(Entity *entity, u8 param_2) { @@ -97,7 +79,6 @@ s32 sub_80861F8(s16 param_1,Entity *param_2,bool32 param_3) s32 uStack_38; Position pos; unkStruct_80416E0 stack; - struct unkStruct_8107380 stack4; #ifdef NONMATCHING s32 param_1_s32 = param_1; @@ -106,7 +87,7 @@ s32 sub_80861F8(s16 param_1,Entity *param_2,bool32 param_3) #endif u8 param_3_bool32 = param_3; - + sub_800EE5C(param_1); sub_800EF64(); sub_803E46C(0x46); @@ -122,12 +103,12 @@ s32 sub_80861F8(s16 param_1,Entity *param_2,bool32 param_3) stack.unk8 = (u32)(info->action).direction; stack.x = (param_2->pixelPos).x / 256; stack.y = (param_2->pixelPos).y / 256; - + stack.unk10 = pos.x; stack.unk12 = pos.y; stack.unk14 = uStack_38; stack.unk18 = 0xffff; - stack4 = gUnknown_8107380; + stack.unk1C = gUnknown_8107380; uVar2 = sub_800E890(&stack); if (param_3_bool32 != '\0') {