From 3dfdc4e2d869d6f4542c69f91de4ff4544ebea3f Mon Sep 17 00:00:00 2001 From: macabeus Date: Fri, 24 Jan 2025 01:53:30 +0000 Subject: [PATCH] decomp `sub_806394C` Thanks anon! --- asm/enemy_marun.s | 197 --------------------------------------- src/game/enemies/marun.c | 85 +++++++++++++++++ 2 files changed, 85 insertions(+), 197 deletions(-) diff --git a/asm/enemy_marun.s b/asm/enemy_marun.s index e5447221..634fd3c5 100644 --- a/asm/enemy_marun.s +++ b/asm/enemy_marun.s @@ -8,203 +8,6 @@ .if 0 .endif - thumb_func_start sub_806394C -sub_806394C: @ 0x0806394C - push {r4, r5, r6, r7, lr} - sub sp, #0xc - ldr r0, _080639AC @ =gCurTask - ldr r0, [r0] - ldrh r1, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r5, r1, r0 - movs r4, #0 - adds r0, r5, #0 - bl sub_8063BB8 - ldr r0, [r5, #0x24] - asrs r2, r0, #8 - ldr r0, [r5, #0x28] - asrs r1, r0, #8 - ldrh r0, [r5, #0xc] - lsls r0, r0, #8 - adds r2, r2, r0 - ldrh r0, [r5, #0xe] - lsls r0, r0, #8 - adds r1, r1, r0 - movs r0, #0xa - ldrsb r0, [r5, r0] - cmp r0, #0 - ble _080639B4 - subs r1, #8 - movs r3, #8 - rsbs r3, r3, #0 - str r4, [sp] - ldr r0, _080639B0 @ =sub_805203C - str r0, [sp, #4] - adds r0, r2, #0 - movs r2, #1 - bl sub_8052394 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - bge _080639E6 - lsls r1, r0, #8 - ldr r0, [r5, #0x24] - subs r0, r0, r1 - movs r1, #0x80 - lsls r1, r1, #4 - b _080639DA - .align 2, 0 -_080639AC: .4byte gCurTask -_080639B0: .4byte sub_805203C -_080639B4: - adds r0, r2, #0 - adds r0, #8 - subs r1, #8 - str r4, [sp] - ldr r2, _08063A68 @ =sub_805203C - str r2, [sp, #4] - movs r2, #1 - movs r3, #8 - bl sub_8052394 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - bge _080639E6 - lsls r1, r0, #8 - ldr r0, [r5, #0x24] - adds r0, r0, r1 - ldr r1, _08063A6C @ =0xFFFFF800 -_080639DA: - adds r0, r0, r1 - str r0, [r5, #0x24] - movs r0, #1 - strb r0, [r5, #4] - movs r0, #0 - str r0, [r5, #0x14] -_080639E6: - ldr r0, _08063A70 @ =gStageData - ldrb r1, [r0, #4] - subs r0, r1, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bls _08063AB4 - cmp r1, #4 - beq _08063AB4 - ldrh r0, [r5, #0x12] - adds r0, #1 - movs r7, #0 - strh r0, [r5, #0x12] - lsls r0, r0, #0x10 - movs r1, #0xb4 - lsls r1, r1, #0x11 - cmp r0, r1 - bgt _08063A10 - lsls r0, r4, #0x18 - cmp r0, #0 - bge _08063AB4 -_08063A10: - adds r6, r5, #0 - adds r6, #0x38 - ldr r1, _08063A74 @ =gUnknown_080D210C - ldrh r0, [r1, #0x18] - strh r0, [r6, #0xc] - ldrb r0, [r1, #0x1a] - strb r0, [r6, #0x1a] - movs r0, #0xff - strb r0, [r6, #0x1b] - add r0, sp, #8 - strh r7, [r0] - adds r1, r5, #0 - adds r1, #0x64 - ldr r4, _08063A78 @ =0x01000002 - adds r2, r4, #0 - bl CpuSet - mov r0, sp - adds r0, #0xa - strh r7, [r0] - adds r1, r5, #0 - adds r1, #0x5c - adds r2, r4, #0 - bl CpuSet - movs r1, #0x80 - lsls r1, r1, #5 - str r1, [r6, #8] - movs r0, #0xa - ldrsb r0, [r5, r0] - cmp r0, #0 - bge _08063A58 - movs r0, #0x80 - lsls r0, r0, #3 - orrs r0, r1 - str r0, [r6, #8] -_08063A58: - movs r0, #0xa - ldrsb r0, [r5, r0] - cmp r0, #0 - ble _08063A7C - ldr r0, [r5, #0x24] - movs r1, #0x98 - lsls r1, r1, #5 - b _08063A82 - .align 2, 0 -_08063A68: .4byte sub_805203C -_08063A6C: .4byte 0xFFFFF800 -_08063A70: .4byte gStageData -_08063A74: .4byte gUnknown_080D210C -_08063A78: .4byte 0x01000002 -_08063A7C: - ldr r0, [r5, #0x24] - movs r1, #0xd0 - lsls r1, r1, #4 -_08063A82: - adds r0, r0, r1 - str r0, [r5, #0x24] - adds r0, r6, #0 - bl UpdateSpriteAnimation - movs r2, #0 - movs r1, #0 - strh r1, [r5, #0x10] - strh r1, [r5, #0x12] - movs r0, #0x80 - lsls r0, r0, #2 - str r0, [r5, #0x14] - str r1, [r5, #0x18] - strb r2, [r5, #8] - movs r0, #1 - strb r0, [r5, #5] - ldr r0, _08063AAC @ =gCurTask - ldr r1, [r0] - ldr r0, _08063AB0 @ =sub_8063ADC - str r0, [r1, #8] - b _08063AD2 - .align 2, 0 -_08063AAC: .4byte gCurTask -_08063AB0: .4byte sub_8063ADC -_08063AB4: - adds r0, r5, #0 - bl sub_8063D38 - cmp r0, #1 - bne _08063ACC - ldr r0, _08063AC8 @ =gCurTask - ldr r0, [r0] - bl TaskDestroy - b _08063AD2 - .align 2, 0 -_08063AC8: .4byte gCurTask -_08063ACC: - adds r0, r5, #0 - bl sub_8063E5C -_08063AD2: - add sp, #0xc - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 - thumb_func_start sub_8063ADC sub_8063ADC: @ 0x08063ADC push {r4, r5, r6, r7, lr} diff --git a/src/game/enemies/marun.c b/src/game/enemies/marun.c index ca12d74e..013aafe6 100644 --- a/src/game/enemies/marun.c +++ b/src/game/enemies/marun.c @@ -6,6 +6,7 @@ #include "game/camera.h" #include "game/entity.h" #include "game/enemy_unknown.h" +#include "module_unclear.h" #include "game/player.h" #include "game/stage.h" @@ -41,7 +42,9 @@ u32 sub_8063C98(void* base); void sub_8063858(void); bool32 sub_8063D38(void* param); s32 sub_8063E5C(Marun *enemy); +void sub_8063BB8(Marun* enemy); void sub_806394C(void); +void sub_8063ADC(void); // static void Task_Marun0() {} void Task_MarunInit(void); @@ -205,6 +208,88 @@ void sub_8063858(void) { } } +// https://decomp.me/scratch/m3tax +void sub_806394C(void) { + Marun* enemy = TASK_DATA(gCurTask); + s8 collisionResult = 0; + s32 x, y; + s32 r1; + s32 r0; + + sub_8063BB8(enemy); + + x = (enemy->qPos.x >> 8); + y = (enemy->qPos.y >> 8); + + x += (enemy->region[0] << 8); + y += (enemy->region[1] << 8); + + if (enemy->direction > 0) { + collisionResult = sub_8052394(x, y - 8, 1, -8, 0, sub_805203C); + + if (collisionResult < 0) { + enemy->qPos.x -= (collisionResult << 8); + enemy->qPos.x += 0x800; + + enemy->unk4 = 1; + enemy->unk14 = 0; + } + + } else { + collisionResult = sub_8052394(x + 8, y - 8, 1, 8, 0, sub_805203C); + + if (collisionResult < 0) { + enemy->qPos.x += (collisionResult << 8); + enemy->qPos.x -= 0x800; + + enemy->unk4 = 1; + enemy->unk14 = 0; + } + } + + if ((gStageData.unk4 != 1 && gStageData.unk4 != 2 && gStageData.unk4 != 4) && + (r0 = ++enemy->unk12, r0 <<= 16, r0 > (r1 = 0x1680000) || collisionResult < 0)) { + Sprite* s = &enemy->s; + + s->anim = gUnknown_080D210C[3].anim; + s->variant = gUnknown_080D210C[3].variant; + s->prevVariant = 0xFF; + + CpuFill16(0, &enemy->reserved.b, sizeof(Rect8)); + CpuFill16(0, &enemy->s.hitboxes[0].b, sizeof(Rect8)); + + s->frameFlags = 0x1000; + + if (enemy->direction < 0) { + s->frameFlags |= 0x400; + } + + if (enemy->direction > 0) { + enemy->qPos.x += 0x1300; + } else { + enemy->qPos.x += 0xD00; + } + + UpdateSpriteAnimation(s); + + enemy->rotation = 0; + enemy->unk12 = 0; + enemy->unk14 = 0x200; + enemy->unk18 = 0; + enemy->unk8 = 0; + enemy->unk5 = 1; + + gCurTask->main = sub_8063ADC; + + } else { + if (sub_8063D38(enemy) == 1) { + TaskDestroy(gCurTask); + } else { + sub_8063E5C(enemy); + } + } +} + // https://decomp.me/scratch/LwjhM // bool32 sub_8063D38(void* param) { // EnemyUnknownStruc0 unk;