From 098c0c9bf677194e08ffc6721f9fff60127c5198 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Sun, 10 Jul 2022 01:17:38 +0300 Subject: [PATCH] Decompile dust functions (except 2) --- asm/enemy/dust.s | 663 ------------------------- asm/non_matching/dust/sub_080442BC.inc | 46 ++ asm/non_matching/dust/sub_08044310.inc | 213 ++++++++ data/const/enemy/dust.s | 15 +- linker.ld | 3 +- src/enemy/dust.c | 327 ++++++++++++ src/object/lilypadLarge.c | 6 +- src/object/pullableMushroom.c | 2 +- 8 files changed, 593 insertions(+), 682 deletions(-) delete mode 100644 asm/enemy/dust.s create mode 100644 asm/non_matching/dust/sub_080442BC.inc create mode 100644 asm/non_matching/dust/sub_08044310.inc create mode 100644 src/enemy/dust.c diff --git a/asm/enemy/dust.s b/asm/enemy/dust.s deleted file mode 100644 index b91ea514..00000000 --- a/asm/enemy/dust.s +++ /dev/null @@ -1,663 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Dust -Dust: @ 0x08044118 - push {r4, r5, lr} - adds r5, r0, #0 - ldr r4, _08044130 @ =gUnk_080D1588 - bl GetNextFunction - lsls r0, r0, #2 - adds r0, r0, r4 - ldr r1, [r0] - adds r0, r5, #0 - bl _call_via_r1 - pop {r4, r5, pc} - .align 2, 0 -_08044130: .4byte gUnk_080D1588 - - thumb_func_start sub_08044134 -sub_08044134: @ 0x08044134 - push {lr} - ldr r2, _08044148 @ =gUnk_080D15A0 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08044148: .4byte gUnk_080D15A0 - - thumb_func_start sub_0804414C -sub_0804414C: @ 0x0804414C - push {lr} - ldr r1, _08044158 @ =gUnk_080D1588 - bl EnemyFunctionHandlerAfterCollision - pop {pc} - .align 2, 0 -_08044158: .4byte gUnk_080D1588 - - thumb_func_start sub_0804415C -sub_0804415C: @ 0x0804415C - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _0804418E - adds r0, r4, #0 - bl sub_0806F520 - cmp r0, #0 - beq _08044188 - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080441BA - movs r0, #8 - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl sub_08044310 - b _080441BA -_08044188: - movs r0, #8 - strb r0, [r4, #0xe] - b _080441BA -_0804418E: - adds r0, r4, #0 - bl sub_0806F520 - cmp r0, #0 - beq _080441B0 - ldr r0, _080441AC @ =gUnk_080D15A8 - ldrb r1, [r4, #0xd] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - b _080441BA - .align 2, 0 -_080441AC: .4byte gUnk_080D15A8 -_080441B0: - adds r0, r4, #0 - bl sub_080445C0 - bl DeleteThisEntity -_080441BA: - pop {r4, pc} - - thumb_func_start sub_080441BC -sub_080441BC: @ 0x080441BC - movs r1, #2 - strb r1, [r0, #0xd] - bx lr - .align 2, 0 - - thumb_func_start sub_080441C4 -sub_080441C4: @ 0x080441C4 - push {lr} - bl sub_0806F4E8 - pop {pc} - - thumb_func_start sub_080441CC -sub_080441CC: @ 0x080441CC - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _080441DE - adds r0, r4, #0 - bl GenericDeath -_080441DE: - pop {r4, pc} - - thumb_func_start sub_080441E0 -sub_080441E0: @ 0x080441E0 - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - movs r0, #0x12 - bl CheckGlobalFlag - cmp r0, #0 - beq _080441F2 - bl DeleteThisEntity -_080441F2: - ldrb r7, [r4, #0xa] - cmp r7, #0 - bne _08044284 -.ifdef EU - movs r0, #0xf5 - lsls r0, r0, #0x1 -.else - ldr r0, _08044244 @ =0x000001EB -.endif - movs r1, #1 - bl sub_080AD8F0 - adds r6, r0, #0 - ldrb r1, [r6] - lsls r0, r1, #2 - adds r0, r0, r1 - adds r5, r0, #1 - adds r0, r5, #0 - bl zMalloc - adds r1, r0, #0 - str r1, [r4, #0x64] - cmp r1, #0 - beq _0804429A - adds r0, r6, #0 - adds r2, r5, #0 - bl MemCopy - adds r1, r4, #0 - adds r1, #0x28 - movs r0, #0xff - strb r0, [r1] - ldr r0, [r4, #0x64] - ldrb r0, [r0] - lsls r0, r0, #3 - adds r0, #0xc - bl zMalloc - adds r2, r0, #0 - cmp r2, #0 - bne _08044248 - ldr r0, [r4, #0x64] - bl zFree - b _0804429A - .align 2, 0 -.ifndef EU -_08044244: .4byte 0x000001EB -.endif -_08044248: - str r2, [r4, #0x48] - ldr r0, _0804427C @ =gHitbox_4 - ldr r1, [r0, #4] - ldr r0, [r0] - str r0, [r2] - str r1, [r2, #4] - adds r0, r4, #0 - bl sub_080442BC - movs r0, #1 - strb r0, [r4, #0x1e] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r0, [r2] - movs r1, #7 - orrs r0, r1 - strb r0, [r2] - adds r0, r4, #0 - adds r0, #0x75 - strb r7, [r0] - adds r1, r4, #0 - adds r1, #0x76 - ldr r0, _08044280 @ =0x0000FFFF - strh r0, [r1] - b _08044292 - .align 2, 0 -_0804427C: .4byte gHitbox_4 -_08044280: .4byte 0x0000FFFF -_08044284: - movs r0, #0 - strb r0, [r4, #0x1e] - strh r0, [r4, #0x24] - ldr r0, _0804429C @ =gHitbox_1 - str r0, [r4, #0x48] - movs r0, #1 - strb r0, [r4, #0x1c] -_08044292: - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #8 - strb r0, [r4, #0xe] -_0804429A: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0804429C: .4byte gHitbox_1 - - thumb_func_start sub_080442A0 -sub_080442A0: @ 0x080442A0 - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xa] - cmp r0, #0 - bne _080442B2 - adds r0, r1, #0 - bl sub_08044498 - b _080442B8 -_080442B2: - adds r0, r1, #0 - bl sub_08044550 -_080442B8: - pop {pc} - .align 2, 0 - - thumb_func_start sub_080442BC -sub_080442BC: @ 0x080442BC - push {r4, r5, r6, r7, lr} - adds r3, r0, #0 - ldr r5, _0804430C @ =gUnk_080D15B4 - ldr r0, [r3, #0x64] - ldrb r6, [r0] - movs r4, #0 - cmp r4, r6 - bhs _08044304 - movs r7, #0 -_080442CE: - ldr r1, [r3, #0x48] - lsls r2, r4, #3 - adds r1, r2, r1 - ldrb r0, [r5] - strb r0, [r1, #0xc] - ldr r0, [r3, #0x48] - adds r0, r2, r0 - ldrb r1, [r5, #1] - strb r1, [r0, #0xd] - ldr r0, [r3, #0x48] - adds r0, r2, r0 - ldrb r1, [r5, #2] - strb r1, [r0, #0xe] - ldr r0, [r3, #0x48] - adds r0, r2, r0 - ldrb r1, [r5, #3] - strb r1, [r0, #0xf] - ldr r0, [r3, #0x48] - adds r0, r2, r0 - adds r0, #0xc - strb r7, [r0, #4] - ldr r0, [r3, #0x48] - adds r2, r2, r0 - strb r4, [r2, #0x11] - adds r4, #1 - cmp r4, r6 - blo _080442CE -_08044304: - adds r0, r3, #0 - adds r0, #0x74 - strb r6, [r0] - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0804430C: .4byte gUnk_080D15B4 - - thumb_func_start sub_08044310 -sub_08044310: @ 0x08044310 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - movs r4, #0xff - movs r6, #0xff - ldr r0, _08044334 @ =gPlayerEntity - ldrb r0, [r0, #0x14] - lsrs r1, r0, #1 - movs r0, #3 - ands r1, r0 - cmp r1, #1 - beq _0804436A - cmp r1, #1 - bgt _08044338 - cmp r1, #0 - beq _08044342 - b _080443EA - .align 2, 0 -_08044334: .4byte gPlayerEntity -_08044338: - cmp r1, #2 - beq _08044392 - cmp r1, #3 - beq _080443C4 - b _080443EA -_08044342: - movs r2, #0 - adds r0, r5, #0 - adds r0, #0x74 - ldrb r0, [r0] - cmp r2, r0 - bhs _080443EA - adds r3, r0, #0 - ldr r1, [r5, #0x48] -_08044352: - ldrb r0, [r1, #0x10] - cmp r0, #0 - bne _08044360 - ldrb r0, [r1, #0xd] - cmp r6, r0 - bls _08044360 - adds r4, r2, #0 -_08044360: - adds r1, #8 - adds r2, #1 - cmp r2, r3 - blo _08044352 - b _080443EA -_0804436A: - movs r2, #0 - adds r0, r5, #0 - adds r0, #0x74 - ldrb r0, [r0] - cmp r2, r0 - bhs _080443EA - adds r3, r0, #0 - ldr r1, [r5, #0x48] -_0804437A: - ldrb r0, [r1, #0x10] - cmp r0, #0 - bne _08044388 - ldrb r0, [r1, #0xe] - cmp r6, r0 - bls _08044388 - adds r4, r2, #0 -_08044388: - adds r1, #8 - adds r2, #1 - cmp r2, r3 - blo _0804437A - b _080443EA -_08044392: - movs r2, #0 - adds r0, r5, #0 - adds r0, #0x74 - ldrb r0, [r0] - cmp r2, r0 - bhs _080443EA - adds r3, r0, #0 - ldr r1, [r5, #0x48] -_080443A2: - ldrb r0, [r1, #0x10] - cmp r0, #0 - bne _080443B0 - ldrb r0, [r1, #0xc] - cmp r6, r0 - bls _080443B0 - adds r4, r2, #0 -_080443B0: - adds r1, #8 - adds r2, #1 - cmp r2, r3 - blo _080443A2 - b _080443EA -_080443BA: - mov r1, r8 - adds r0, r1, r4 - ldrb r0, [r0, #0x11] - strb r0, [r3, #5] - b _08044492 -_080443C4: - movs r2, #0 - adds r0, r5, #0 - adds r0, #0x74 - ldrb r0, [r0] - cmp r2, r0 - bhs _080443EA - adds r3, r0, #0 - ldr r1, [r5, #0x48] -_080443D4: - ldrb r0, [r1, #0x10] - cmp r0, #0 - bne _080443E2 - ldrb r0, [r1, #0xf] - cmp r6, r0 - bls _080443E2 - adds r4, r2, #0 -_080443E2: - adds r1, #8 - adds r2, #1 - cmp r2, r3 - blo _080443D4 -_080443EA: - cmp r4, #0xff - beq _08044492 - ldr r0, [r5, #0x48] - lsls r4, r4, #3 - adds r0, r4, r0 - movs r1, #1 - strb r1, [r0, #0x10] - ldr r1, [r5, #0x64] - ldrb r0, [r1] - subs r0, #1 - strb r0, [r1] - ldr r2, [r5, #0x64] - ldrb r1, [r2] - lsls r0, r1, #2 - adds r0, r0, r1 - adds r0, #1 - adds r7, r2, r0 - ldr r0, [r5, #0x48] - adds r0, r4, r0 - ldrb r1, [r0, #0x11] - lsls r0, r1, #2 - adds r0, r0, r1 - adds r0, #1 - adds r6, r2, r0 - movs r0, #0x53 - movs r1, #1 - bl CreateEnemy - adds r1, r0, #0 - mov r8, r4 - cmp r1, #0 - beq _08044440 - movs r2, #0 - ldrsb r2, [r6, r2] - adds r2, #8 - lsls r2, r2, #0x10 - movs r3, #1 - ldrsb r3, [r6, r3] - adds r3, #8 - lsls r3, r3, #0x10 - adds r0, r5, #0 - bl PositionRelative -_08044440: - ldr r0, [r5, #0x64] - ldrb r0, [r0] - cmp r0, #0 - bne _08044458 - movs r0, #0x12 - bl SetGlobalFlag - movs r0, #0x72 - bl SoundReq - bl DeleteThisEntity -_08044458: - movs r2, #0 - adds r3, r5, #0 - adds r3, #0x74 -_0804445E: - adds r0, r6, r2 - adds r1, r7, r2 - ldrb r1, [r1] - strb r1, [r0] - adds r2, #1 - cmp r2, #4 - bls _0804445E - movs r2, #0 - ldrb r1, [r3] - cmp r2, r1 - bhs _08044492 - ldr r4, [r5, #0x48] - ldr r0, [r5, #0x64] - ldrb r6, [r0] - adds r5, r1, #0 - adds r3, r4, #0 - adds r3, #0xc - adds r1, r4, #0 -_08044482: - ldrb r0, [r1, #0x11] - cmp r0, r6 - beq _080443BA - adds r3, #8 - adds r1, #8 - adds r2, #1 - cmp r2, r5 - blo _08044482 -_08044492: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_08044498 -sub_08044498: @ 0x08044498 - push {r4, r5, r6, lr} - mov ip, r0 - ldr r6, _08044538 @ =gPlayerEntity - movs r1, #0x2e - ldrsh r0, [r6, r1] - ldr r3, _0804453C @ =gRoomControls - ldrh r1, [r3, #6] - subs r0, r0, r1 - asrs r4, r0, #4 - movs r2, #0x3f - ands r4, r2 - movs r5, #0x32 - ldrsh r0, [r6, r5] - ldrh r1, [r3, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r4, r0 - ldr r0, _08044540 @ =gPlayerState - adds r0, #0x92 - ldrh r0, [r0] - movs r1, #0xf0 - lsls r1, r1, #4 - ands r1, r0 - mov r2, ip - adds r2, #0x75 - ldrb r0, [r2] - cmp r1, r0 - bne _080444DE - mov r0, ip - adds r0, #0x76 - ldrh r0, [r0] - cmp r4, r0 - beq _0804454C -_080444DE: - strb r1, [r2] - mov r0, ip - adds r0, #0x76 - strh r4, [r0] - mov r1, ip - ldr r0, [r1, #0x64] - adds r2, r0, #1 - ldrb r4, [r0] - movs r3, #0x2e - ldrsh r1, [r6, r3] - mov r5, ip - movs r3, #0x2e - ldrsh r0, [r5, r3] - subs r5, r1, r0 - movs r0, #0x32 - ldrsh r1, [r6, r0] - mov r3, ip - movs r6, #0x32 - ldrsh r0, [r3, r6] - subs r1, r1, r0 - movs r3, #0 - cmp r3, r4 - bhs _0804454C -_0804450C: - movs r0, #0 - ldrsb r0, [r2, r0] - subs r0, r5, r0 - cmp r0, #0xf - bhi _08044544 - movs r0, #1 - ldrsb r0, [r2, r0] - subs r0, r1, r0 - cmp r0, #0xf - bhi _08044544 - movs r0, #0xf - movs r1, #0x11 - movs r2, #0 - bl CreateObject - adds r1, r0, #0 - cmp r1, #0 - beq _0804454C - ldr r0, _08044538 @ =gPlayerEntity - bl CopyPosition - b _0804454C - .align 2, 0 -_08044538: .4byte gPlayerEntity -_0804453C: .4byte gRoomControls -_08044540: .4byte gPlayerState -_08044544: - adds r2, #5 - adds r3, #1 - cmp r3, r4 - blo _0804450C -_0804454C: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_08044550 -sub_08044550: @ 0x08044550 - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - ldr r0, _080445A8 @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _080445B4 - ldrh r1, [r6, #0x24] - movs r2, #0x24 - ldrsh r0, [r6, r2] - cmp r0, #0xff - bgt _08044570 - adds r0, r1, #0 - adds r0, #0x10 - strh r0, [r6, #0x24] -_08044570: - ldr r5, _080445AC @ =gPlayerEntity - ldrb r0, [r5, #0x14] - movs r4, #0xe - ands r4, r0 - ldr r0, _080445B0 @ =gUnk_08126EE4 - adds r4, r4, r0 - movs r3, #0x2e - ldrsh r0, [r6, r3] - movs r7, #0x32 - ldrsh r1, [r6, r7] - movs r3, #0x2e - ldrsh r2, [r5, r3] - movs r3, #0 - ldrsb r3, [r4, r3] - adds r2, r2, r3 - movs r7, #0x32 - ldrsh r3, [r5, r7] - ldrb r4, [r4, #1] - lsls r4, r4, #0x18 - asrs r4, r4, #0x18 - adds r3, r3, r4 - bl CalculateDirectionTo - strb r0, [r6, #0x15] - adds r0, r6, #0 - bl LinearMoveUpdate - b _080445BE - .align 2, 0 -_080445A8: .4byte gPlayerState -_080445AC: .4byte gPlayerEntity -_080445B0: .4byte gUnk_08126EE4 -_080445B4: - adds r0, r6, #0 - bl sub_080445C0 - bl DeleteThisEntity -_080445BE: - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_080445C0 -sub_080445C0: @ 0x080445C0 - push {r4, lr} - adds r4, r0, #0 - movs r0, #0x21 - movs r1, #1 - movs r2, #1 - bl CreateObject - adds r1, r0, #0 - cmp r1, #0 - beq _080445DA - adds r0, r4, #0 - bl CopyPosition -_080445DA: - pop {r4, pc} diff --git a/asm/non_matching/dust/sub_080442BC.inc b/asm/non_matching/dust/sub_080442BC.inc new file mode 100644 index 00000000..719487b0 --- /dev/null +++ b/asm/non_matching/dust/sub_080442BC.inc @@ -0,0 +1,46 @@ + .syntax unified + push {r4, r5, r6, r7, lr} + adds r3, r0, #0 + ldr r5, _0804430C @ =gUnk_080D15B4 + ldr r0, [r3, #0x64] + ldrb r6, [r0] + movs r4, #0 + cmp r4, r6 + bhs _08044304 + movs r7, #0 +_080442CE: + ldr r1, [r3, #0x48] + lsls r2, r4, #3 + adds r1, r2, r1 + ldrb r0, [r5] + strb r0, [r1, #0xc] + ldr r0, [r3, #0x48] + adds r0, r2, r0 + ldrb r1, [r5, #1] + strb r1, [r0, #0xd] + ldr r0, [r3, #0x48] + adds r0, r2, r0 + ldrb r1, [r5, #2] + strb r1, [r0, #0xe] + ldr r0, [r3, #0x48] + adds r0, r2, r0 + ldrb r1, [r5, #3] + strb r1, [r0, #0xf] + ldr r0, [r3, #0x48] + adds r0, r2, r0 + adds r0, #0xc + strb r7, [r0, #4] + ldr r0, [r3, #0x48] + adds r2, r2, r0 + strb r4, [r2, #0x11] + adds r4, #1 + cmp r4, r6 + blo _080442CE +_08044304: + adds r0, r3, #0 + adds r0, #0x74 + strb r6, [r0] + pop {r4, r5, r6, r7, pc} + .align 2, 0 +_0804430C: .4byte gUnk_080D15B4 + .syntax divided diff --git a/asm/non_matching/dust/sub_08044310.inc b/asm/non_matching/dust/sub_08044310.inc new file mode 100644 index 00000000..19150d22 --- /dev/null +++ b/asm/non_matching/dust/sub_08044310.inc @@ -0,0 +1,213 @@ + .syntax unified + push {r4, r5, r6, r7, lr} + mov r7, r8 + push {r7} + adds r5, r0, #0 + movs r4, #0xff + movs r6, #0xff + ldr r0, _08044334 @ =gPlayerEntity + ldrb r0, [r0, #0x14] + lsrs r1, r0, #1 + movs r0, #3 + ands r1, r0 + cmp r1, #1 + beq _0804436A + cmp r1, #1 + bgt _08044338 + cmp r1, #0 + beq _08044342 + b _080443EA + .align 2, 0 +_08044334: .4byte gPlayerEntity +_08044338: + cmp r1, #2 + beq _08044392 + cmp r1, #3 + beq _080443C4 + b _080443EA +_08044342: + movs r2, #0 + adds r0, r5, #0 + adds r0, #0x74 + ldrb r0, [r0] + cmp r2, r0 + bhs _080443EA + adds r3, r0, #0 + ldr r1, [r5, #0x48] +_08044352: + ldrb r0, [r1, #0x10] + cmp r0, #0 + bne _08044360 + ldrb r0, [r1, #0xd] + cmp r6, r0 + bls _08044360 + adds r4, r2, #0 +_08044360: + adds r1, #8 + adds r2, #1 + cmp r2, r3 + blo _08044352 + b _080443EA +_0804436A: + movs r2, #0 + adds r0, r5, #0 + adds r0, #0x74 + ldrb r0, [r0] + cmp r2, r0 + bhs _080443EA + adds r3, r0, #0 + ldr r1, [r5, #0x48] +_0804437A: + ldrb r0, [r1, #0x10] + cmp r0, #0 + bne _08044388 + ldrb r0, [r1, #0xe] + cmp r6, r0 + bls _08044388 + adds r4, r2, #0 +_08044388: + adds r1, #8 + adds r2, #1 + cmp r2, r3 + blo _0804437A + b _080443EA +_08044392: + movs r2, #0 + adds r0, r5, #0 + adds r0, #0x74 + ldrb r0, [r0] + cmp r2, r0 + bhs _080443EA + adds r3, r0, #0 + ldr r1, [r5, #0x48] +_080443A2: + ldrb r0, [r1, #0x10] + cmp r0, #0 + bne _080443B0 + ldrb r0, [r1, #0xc] + cmp r6, r0 + bls _080443B0 + adds r4, r2, #0 +_080443B0: + adds r1, #8 + adds r2, #1 + cmp r2, r3 + blo _080443A2 + b _080443EA +_080443BA: + mov r1, r8 + adds r0, r1, r4 + ldrb r0, [r0, #0x11] + strb r0, [r3, #5] + b _08044492 +_080443C4: + movs r2, #0 + adds r0, r5, #0 + adds r0, #0x74 + ldrb r0, [r0] + cmp r2, r0 + bhs _080443EA + adds r3, r0, #0 + ldr r1, [r5, #0x48] +_080443D4: + ldrb r0, [r1, #0x10] + cmp r0, #0 + bne _080443E2 + ldrb r0, [r1, #0xf] + cmp r6, r0 + bls _080443E2 + adds r4, r2, #0 +_080443E2: + adds r1, #8 + adds r2, #1 + cmp r2, r3 + blo _080443D4 +_080443EA: + cmp r4, #0xff + beq _08044492 + ldr r0, [r5, #0x48] + lsls r4, r4, #3 + adds r0, r4, r0 + movs r1, #1 + strb r1, [r0, #0x10] + ldr r1, [r5, #0x64] + ldrb r0, [r1] + subs r0, #1 + strb r0, [r1] + ldr r2, [r5, #0x64] + ldrb r1, [r2] + lsls r0, r1, #2 + adds r0, r0, r1 + adds r0, #1 + adds r7, r2, r0 + ldr r0, [r5, #0x48] + adds r0, r4, r0 + ldrb r1, [r0, #0x11] + lsls r0, r1, #2 + adds r0, r0, r1 + adds r0, #1 + adds r6, r2, r0 + movs r0, #0x53 + movs r1, #1 + bl CreateEnemy + adds r1, r0, #0 + mov r8, r4 + cmp r1, #0 + beq _08044440 + movs r2, #0 + ldrsb r2, [r6, r2] + adds r2, #8 + lsls r2, r2, #0x10 + movs r3, #1 + ldrsb r3, [r6, r3] + adds r3, #8 + lsls r3, r3, #0x10 + adds r0, r5, #0 + bl PositionRelative +_08044440: + ldr r0, [r5, #0x64] + ldrb r0, [r0] + cmp r0, #0 + bne _08044458 + movs r0, #0x12 + bl SetGlobalFlag + movs r0, #0x72 + bl SoundReq + bl DeleteThisEntity +_08044458: + movs r2, #0 + adds r3, r5, #0 + adds r3, #0x74 +_0804445E: + adds r0, r6, r2 + adds r1, r7, r2 + ldrb r1, [r1] + strb r1, [r0] + adds r2, #1 + cmp r2, #4 + bls _0804445E + movs r2, #0 + ldrb r1, [r3] + cmp r2, r1 + bhs _08044492 + ldr r4, [r5, #0x48] + ldr r0, [r5, #0x64] + ldrb r6, [r0] + adds r5, r1, #0 + adds r3, r4, #0 + adds r3, #0xc + adds r1, r4, #0 +_08044482: + ldrb r0, [r1, #0x11] + cmp r0, r6 + beq _080443BA + adds r3, #8 + adds r1, #8 + adds r2, #1 + cmp r2, r5 + blo _08044482 +_08044492: + pop {r3} + mov r8, r3 + pop {r4, r5, r6, r7, pc} + .syntax divided diff --git a/data/const/enemy/dust.s b/data/const/enemy/dust.s index e8f1e1cb..c5f31680 100644 --- a/data/const/enemy/dust.s +++ b/data/const/enemy/dust.s @@ -4,22 +4,9 @@ .section .rodata .align 2 -gUnk_080D1588:: @ 080D1588 - .4byte sub_08044134 - .4byte sub_0804414C - .4byte GenericKnockback - .4byte GenericDeath - .4byte GenericConfused - .4byte sub_0804415C -gUnk_080D15A0:: @ 080D15A0 - .4byte sub_080441E0 - .4byte sub_080442A0 -gUnk_080D15A8:: @ 080D15A8 - .4byte sub_080441BC - .4byte sub_080441C4 - .4byte sub_080441CC + gUnk_080D15B4:: @ 080D15B4 .incbin "dust/gUnk_080D15B4.bin" diff --git a/linker.ld b/linker.ld index 03aee1c6..476f2051 100644 --- a/linker.ld +++ b/linker.ld @@ -381,7 +381,7 @@ SECTIONS { src/enemy/enemy50.o(.text); src/enemy/vaatiWrath.o(.text); src/enemy/vaatiArm.o(.text); - asm/enemy/dust.o(.text); + src/enemy/dust.o(.text); src/enemy/vaatiBall.o(.text); src/enemy/slime.o(.text); src/enemy/sub_080451CC.o(.text); @@ -1031,6 +1031,7 @@ SECTIONS { data/animations/enemy/vaatiWrath.o(.rodata); src/enemy/vaatiArm.o(.rodata); data/animations/enemy/vaatiArm.o(.rodata); + src/enemy/dust.o(.rodata); data/const/enemy/dust.o(.rodata); src/enemy/vaatiBall.o(.rodata); data/animations/enemy/vaatiBall.o(.rodata); diff --git a/src/enemy/dust.c b/src/enemy/dust.c new file mode 100644 index 00000000..464cd41d --- /dev/null +++ b/src/enemy/dust.c @@ -0,0 +1,327 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "enemy.h" +#include "hitbox.h" +#include "player.h" +#include "physics.h" +#include "room.h" +#include "asm.h" +#include "object.h" + +typedef struct { + Entity base; + u8 filler[0xc]; + u8 unk_74; + u8 unk_75; + u16 unk_76; +} DustEntity; + +typedef struct { + s8 unk_0; + s8 unk_1; + u8 unk_2; + u8 unk_3; + u8 unk_4; +} PACKED DustHeapItem; + +typedef struct { + u8 unk_0; + DustHeapItem items[0]; +} PACKED DustHeap; + +#define HEAP ((DustHeap*)super->myHeap) + +#ifdef EU +#define DUST_SPRITE_INDEX 0x1ea +#else +#define DUST_SPRITE_INDEX 0x1eb +#endif + +void sub_08044134(DustEntity*); +void sub_0804414C(DustEntity*); +void sub_0804415C(DustEntity*); +void sub_080441E0(DustEntity*); +void sub_080442A0(DustEntity*); +void sub_080441CC(DustEntity*); +void sub_080441C4(DustEntity*); +void sub_080441BC(DustEntity*); +void sub_08044310(DustEntity*); +void sub_080445C0(DustEntity*); +void sub_080442BC(DustEntity*); +void sub_08044498(DustEntity*); +void sub_08044550(DustEntity*); + +extern void* sub_080AD8F0(u32, u32); + +extern const s8 gUnk_08126EE4[]; + +void (*const Dust_Functions[])(Entity*) = { + (EntityActionPtr)sub_08044134, (EntityActionPtr)sub_0804414C, GenericKnockback, GenericDeath, GenericConfused, + (EntityActionPtr)sub_0804415C, +}; + +void Dust(Entity* this) { + Dust_Functions[GetNextFunction(this)](this); +} + +void sub_08044134(DustEntity* this) { + static void (*const Dust_Actions[])(DustEntity*) = { + sub_080441E0, + sub_080442A0, + }; + Dust_Actions[super->action](this); +} + +void sub_0804414C(DustEntity* this) { + EnemyFunctionHandlerAfterCollision(super, Dust_Functions); +} + +void sub_0804415C(DustEntity* this) { + static void (*const Dust_SubActions[])(DustEntity*) = { + sub_080441BC, + sub_080441C4, + sub_080441CC, + }; + + if (super->type == 0) { + if (sub_0806F520(super)) { + if (--super->timer == 0) { + super->timer = 8; + sub_08044310(this); + } + } else { + super->timer = 8; + } + } else { + if (sub_0806F520(super)) { + Dust_SubActions[super->subAction](this); + } else { + sub_080445C0(this); + DeleteThisEntity(); + } + } +} + +void sub_080441BC(DustEntity* this) { + super->subAction = 2; +} + +void sub_080441C4(DustEntity* this) { + sub_0806F4E8(super); +} + +void sub_080441CC(DustEntity* this) { + if (sub_0806F3E4(super)) { + GenericDeath(super); + } +} + +void sub_080441E0(DustEntity* this) { + int iVar1; + u8* pbVar2; + u32* puVar3; + Hitbox* pHVar4; + + if (CheckGlobalFlag(MACHI_MACHIHOKORI)) { + DeleteThisEntity(); + } + if (super->type == 0) { + pbVar2 = (u8*)sub_080AD8F0(DUST_SPRITE_INDEX, 1); + iVar1 = (u32)*pbVar2 * sizeof(DustHeapItem) + 1; + puVar3 = (u32*)zMalloc(iVar1); + super->myHeap = puVar3; + if (puVar3 == NULL) { + return; + } + MemCopy(pbVar2, puVar3, iVar1); + super->spriteAnimation[2] = 0xff; + pHVar4 = (Hitbox*)zMalloc(HEAP->unk_0 * 8 + 0xc); + if (pHVar4 == NULL) { + zFree(super->myHeap); + return; + } + super->hitbox = pHVar4; + *pHVar4 = gHitbox_4; + sub_080442BC(this); + super->frameIndex = 1; + super->spritePriority.b0 = 7; + this->unk_75 = 0; + this->unk_76 = 0xffff; + } else { + super->frameIndex = 0; + super->speed = 0; + super->hitbox = (Hitbox*)&gHitbox_1; + super->gustJarFlags = 1; + } + super->action = 1; + super->timer = 8; +} + +void sub_080442A0(DustEntity* this) { + if (super->type == 0) { + sub_08044498(this); + } else { + sub_08044550(this); + } +} + +extern const u8 gUnk_080D15B4[]; + +NONMATCH("asm/non_matching/dust/sub_080442BC.inc", void sub_080442BC(DustEntity* this)) { + u32 bVar1; + u32 i; + u32 tmp; + const u8* ptr = gUnk_080D15B4; + u8* ptr2; + + bVar1 = HEAP->unk_0; + + for (i = 0; i < bVar1; i++) { + tmp = 0; + super->hitbox[i + 1].unk2[2] = ptr[0]; + super->hitbox[i + 1].unk2[3] = ptr[1]; + super->hitbox[i + 1].width = ptr[2]; + super->hitbox[i + 1].height = ptr[3]; + // hitbox is probably misused here. + super->hitbox[i + 1].offset_x = tmp; + super->hitbox[i + 2].offset_y = (s8)i; + } + this->unk_74 = bVar1; +} +END_NONMATCH + +// heap and hitbox struct +NONMATCH("asm/non_matching/dust/sub_08044310.inc", void sub_08044310(DustEntity* this)) { + Entity* iVar1; + u32 bVar2; + Hitbox* pHVar3; + DustHeap* puVar4; + u32 i; + u8* puVar6; + u32 uVar7; + Hitbox* pHVar8; + u8* pbVar9; + u32 tmp; + + uVar7 = 0xff; + tmp = 0xff; + switch (gPlayerEntity.animationState >> 1 & 3) { + case 0: + for (i = 0; i < this->unk_74; i++) { + if (((u8)super->hitbox[i + 2].offset_x == 0) && (tmp > (u32)super->hitbox[i + 1].unk2[3])) { + uVar7 = i; + } + } + break; + case 1: + for (i = 0; i < this->unk_74; i++) { + if (((u8)super->hitbox[i + 2].offset_x == 0) && (tmp > (u8)super->hitbox[i + 1].width)) { + uVar7 = i; + } + } + break; + case 2: + for (i = 0; i < this->unk_74; i++) { + if ((u8)super->hitbox[i + 2].offset_x == 0 && (tmp > (u8)super->hitbox[i + 1].unk2[2])) { + uVar7 = i; + } + } + break; + case 3: + for (i = 0; i < this->unk_74; i++) { + if (((u8)super->hitbox[i + 2].offset_x == 0) && (tmp > super->hitbox[i + 1].height)) { + uVar7 = i; + } + } + break; + } + + if (uVar7 != 0xff) { + super->hitbox[uVar7 + 2].offset_x = 1; + HEAP->unk_0--; + puVar4 = HEAP; + bVar2 = puVar4->unk_0; + pbVar9 = &puVar4->items[(u32)(u8)super->hitbox[uVar7 + 2].offset_y].unk_1; + iVar1 = CreateEnemy(DUST, 1); + if (iVar1 != 0) { + PositionRelative(super, iVar1, ((s8)*pbVar9 + 8) * 0x10000, ((s8)pbVar9[1] + 8) * 0x10000); + } + + if (HEAP->unk_0 == 0) { + SetGlobalFlag(MACHI_MACHIHOKORI); + SoundReq(SFX_SECRET); + DeleteThisEntity(); + } + + for (i = 0; i < 5; i++) { + pbVar9[i] = (&puVar4->unk_0)[i]; + } + + for (i = 0; i < this->unk_74; i++) { + if ((u8)super->hitbox[i + 2].offset_y == HEAP->unk_0) { + super->hitbox[i].unk2[3] = super->hitbox[uVar7 + 2].offset_y; + return; + } + } + } +} +END_NONMATCH + +void sub_08044498(DustEntity* this) { + Entity* pEVar1; + DustHeapItem* pbVar2; + u32 i; + u32 tileIndex; + u32 uVar4; + u32 tmp; + u32 xdiff, ydiff; + + uVar4 = COORD_TO_TILE(&gPlayerEntity); + tmp = (gPlayerState.field_0x92 & 0xf00); + if (tmp != this->unk_75 || uVar4 != this->unk_76) { + this->unk_75 = tmp; + this->unk_76 = uVar4; + pbVar2 = HEAP->items; + uVar4 = HEAP->unk_0; + xdiff = gPlayerEntity.x.HALF.HI - super->x.HALF.HI; + ydiff = gPlayerEntity.y.HALF.HI - super->y.HALF.HI; + + for (i = 0; i < uVar4; i++) { + if (xdiff - pbVar2[i].unk_0 < 0x10 && ydiff - pbVar2[i].unk_1 < 0x10) { + pEVar1 = CreateObject(SPECIAL_FX, 0x11, 0); + if (pEVar1 == NULL) { + return; + } + CopyPosition(&gPlayerEntity, pEVar1); + return; + } + } + } +} + +void sub_08044550(DustEntity* this) { + u8 uVar1; + const s8* ptr; + + if ((gPlayerState.field_0x1c & 0xf) == 1) { + if (super->speed < 0x100) { + super->speed += 0x10; + } + ptr = &gUnk_08126EE4[gPlayerEntity.animationState & 0xe]; + super->direction = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, gPlayerEntity.x.HALF.HI + ptr[0], + gPlayerEntity.y.HALF.HI + ptr[1]); + LinearMoveUpdate(super); + } else { + sub_080445C0(this); + DeleteThisEntity(); + } +} + +void sub_080445C0(DustEntity* this) { + Entity* pEVar1; + + pEVar1 = CreateObject(OBJECT_21, 1, 1); + if (pEVar1 != NULL) { + CopyPosition(super, pEVar1); + } +} diff --git a/src/object/lilypadLarge.c b/src/object/lilypadLarge.c index 81314d9b..866fa2cc 100644 --- a/src/object/lilypadLarge.c +++ b/src/object/lilypadLarge.c @@ -27,7 +27,7 @@ typedef struct { u8 unk_85; } LilypadLargeEntity; -extern u8 gUnk_08126EE4[]; +extern s8 gUnk_08126EE4[]; void sub_080855E8(LilypadLargeEntity*); void sub_08085CDC(LilypadLargeEntity*); @@ -166,8 +166,8 @@ void sub_080855E8(LilypadLargeEntity* this) { SoundReq(SFX_WATER_WALK); } if ((super->contactFlags & 0x7f) == 0x13) { - sVar10 = gPlayerEntity.x.HALF.HI + (s8)gUnk_08126EE4[gPlayerEntity.animationState & 0xe]; - uVar4 = gPlayerEntity.y.HALF.HI + (s8)gUnk_08126EE4[gPlayerEntity.animationState | 1]; + sVar10 = gPlayerEntity.x.HALF.HI + gUnk_08126EE4[gPlayerEntity.animationState & 0xe]; + uVar4 = gPlayerEntity.y.HALF.HI + gUnk_08126EE4[gPlayerEntity.animationState | 1]; super->direction = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, sVar10, uVar4); switch (gPlayerState.gustJarSpeed) { diff --git a/src/object/pullableMushroom.c b/src/object/pullableMushroom.c index f4b1d794..3a4bbb7b 100644 --- a/src/object/pullableMushroom.c +++ b/src/object/pullableMushroom.c @@ -21,7 +21,7 @@ typedef struct { /*0x7c*/ u32 unk_7c; } PullableMushroomEntity; -extern const u8 gUnk_08126EE4[]; +extern const s8 gUnk_08126EE4[]; void PullableMushroom_Init(PullableMushroomEntity*); void PullableMushroom_Action1(PullableMushroomEntity*);