From a0af1ae46d0714277986fb998358b43057dc7fd2 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 28 May 2021 14:17:45 +0200 Subject: [PATCH] decomp vaati projectile --- asm/non_matching/vaati/sub_08043DB0.inc | 129 ----- asm/vaatiProjectile.s | 629 ------------------------ data/const/enemy/vaatiProjectile.s | 25 - linker.ld | 4 +- src/enemy/vaatiArm.c | 66 ++- src/enemy/vaatiProjectile.c | 262 ++++++++++ 6 files changed, 296 insertions(+), 819 deletions(-) delete mode 100644 asm/non_matching/vaati/sub_08043DB0.inc delete mode 100644 asm/vaatiProjectile.s delete mode 100644 data/const/enemy/vaatiProjectile.s create mode 100644 src/enemy/vaatiProjectile.c diff --git a/asm/non_matching/vaati/sub_08043DB0.inc b/asm/non_matching/vaati/sub_08043DB0.inc deleted file mode 100644 index abd69612..00000000 --- a/asm/non_matching/vaati/sub_08043DB0.inc +++ /dev/null @@ -1,129 +0,0 @@ - .syntax unified - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldr r0, _08043E48 @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08043EAC - ldr r0, [r5, #0x64] - ldr r2, [r0, #0xc] - movs r1, #0x2e - ldrsh r0, [r2, r1] - ldr r6, _08043E4C @ =gRoomControls - ldrh r1, [r6, #6] - subs r0, r0, r1 - movs r3, #0x32 - ldrsh r1, [r2, r3] - ldrh r2, [r6, #8] - subs r1, r1, r2 - adds r1, #2 - movs r2, #3 - movs r3, #3 - bl CheckPlayerInRegion - cmp r0, #0 - beq _08043EAC - ldr r0, _08043E50 @ =gUnk_080D13EC - bl DoExitTransition - ldr r4, _08043E54 @ =gScreenTransition - adds r0, r4, #0 - adds r0, #0x39 - ldrb r1, [r0] - movs r0, #3 - ands r0, r1 - cmp r0, #3 - beq _08043DFE - movs r0, #1 - strb r0, [r4, #0xd] -_08043DFE: - adds r0, r5, #0 - adds r0, #0x7a - ldrh r0, [r0] - movs r1, #0x3c - bl __divsi3 - movs r1, #0x1e - subs r1, r1, r0 - adds r0, r4, #0 - adds r0, #0x3d - strb r1, [r0] - ldrb r1, [r5, #0xb] - subs r0, #1 - strb r1, [r0] - ldr r0, [r5, #0x64] - ldr r2, [r0, #0x14] - ldrh r1, [r2, #0x2e] - adds r0, r4, #0 - adds r0, #0x40 - strh r1, [r0] - ldrh r0, [r2, #0x32] - adds r1, r4, #0 - adds r1, #0x42 - strh r0, [r1] - ldr r0, [r2, #0x64] - ldr r3, [r0, #0x14] - cmp r3, #0 - beq _08043E58 - ldrh r1, [r3, #0x2e] - adds r0, r4, #0 - adds r0, #0x44 - strh r1, [r0] - ldrh r1, [r3, #0x32] - adds r0, #2 - strh r1, [r0] - b _08043E70 - .align 2, 0 -_08043E48: .4byte gPlayerState -_08043E4C: .4byte gRoomControls -_08043E50: .4byte gUnk_080D13EC -_08043E54: .4byte gScreenTransition -_08043E58: - movs r1, #0x88 - lsls r1, r1, #1 - adds r0, r1, #0 - ldrh r3, [r6, #6] - adds r0, r0, r3 - adds r1, r4, #0 - adds r1, #0x44 - strh r0, [r1] - ldrh r0, [r6, #8] - adds r0, #0x60 - adds r1, #2 - strh r0, [r1] -_08043E70: - ldr r0, [r2, #0x64] - ldr r3, [r0, #0x18] - cmp r3, #0 - beq _08043E90 - ldr r1, _08043E8C @ =gScreenTransition - ldrh r2, [r3, #0x2e] - adds r0, r1, #0 - adds r0, #0x48 - strh r2, [r0] - ldrh r0, [r3, #0x32] - adds r1, #0x4a - strh r0, [r1] - b _08043EAC - .align 2, 0 -_08043E8C: .4byte gScreenTransition -_08043E90: - ldr r2, _08043EB0 @ =gScreenTransition - ldr r3, _08043EB4 @ =gRoomControls - movs r1, #0x88 - lsls r1, r1, #1 - adds r0, r1, #0 - ldrh r1, [r3, #6] - adds r0, r0, r1 - adds r1, r2, #0 - adds r1, #0x48 - strh r0, [r1] - ldrh r0, [r3, #8] - adds r0, #0x60 - adds r2, #0x4a - strh r0, [r2] -_08043EAC: - pop {r4, r5, r6, pc} - .align 2, 0 -_08043EB0: .4byte gScreenTransition -_08043EB4: .4byte gRoomControls - .syntax divided diff --git a/asm/vaatiProjectile.s b/asm/vaatiProjectile.s deleted file mode 100644 index 1be37b71..00000000 --- a/asm/vaatiProjectile.s +++ /dev/null @@ -1,629 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start VaatiProjectile -VaatiProjectile: @ 0x0803E08C - push {r4, r5, lr} - adds r5, r0, #0 - bl sub_0803E4A0 - cmp r0, #0 - beq _0803E0AA - ldrb r0, [r5, #0x10] - movs r1, #0x7f - ands r1, r0 - movs r0, #0 - strb r1, [r5, #0x10] - adds r1, r5, #0 - adds r1, #0x45 - strb r0, [r1] - str r0, [r5, #0x50] -_0803E0AA: - ldr r4, _0803E0C0 @ =gUnk_080D0648 - adds r0, r5, #0 - 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 -_0803E0C0: .4byte gUnk_080D0648 - - thumb_func_start sub_0803E0C4 -sub_0803E0C4: @ 0x0803E0C4 - push {lr} - ldr r2, _0803E0D8 @ =gUnk_080D0660 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0803E0D8: .4byte gUnk_080D0660 - - thumb_func_start sub_0803E0DC -sub_0803E0DC: @ 0x0803E0DC - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r0, #0x41 - ldrb r0, [r0] - cmp r0, #0x80 - bne _0803E16C - adds r0, r5, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - beq _0803E158 - movs r0, #5 - strb r0, [r5, #0xc] - ldrb r1, [r5, #0x10] - movs r6, #0x7f - adds r0, r6, #0 - ands r0, r1 - strb r0, [r5, #0x10] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - ldr r3, _0803E154 @ =gPlayerEntity - ldrb r1, [r3, #0x10] - adds r0, r6, #0 - ands r0, r1 - strb r0, [r3, #0x10] - ldrb r2, [r5, #0x1b] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r4, [r3, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r4 - orrs r0, r2 - strb r0, [r3, #0x1b] - ldrb r0, [r5, #0x19] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r3, #0x19] - ands r1, r2 - orrs r1, r0 - strb r1, [r3, #0x19] - adds r0, r5, #0 - bl sub_0803E444 - movs r0, #2 - bl sub_08078A90 - ldr r2, [r5, #0x50] - cmp r2, #0 - beq _0803E16C - ldrb r1, [r2, #0x10] - adds r0, r6, #0 - ands r0, r1 - b _0803E16A - .align 2, 0 -_0803E154: .4byte gPlayerEntity -_0803E158: - ldr r2, _0803E178 @ =gPlayerState - ldr r0, [r2, #0x30] - ldr r1, _0803E17C @ =0xFFFFFEFF - ands r0, r1 - str r0, [r2, #0x30] - ldr r2, _0803E180 @ =gPlayerEntity - ldrb r1, [r2, #0x10] - movs r0, #0x80 - orrs r0, r1 -_0803E16A: - strb r0, [r2, #0x10] -_0803E16C: - ldr r1, _0803E184 @ =gUnk_080D0648 - adds r0, r5, #0 - bl sub_0804AA30 - pop {r4, r5, r6, pc} - .align 2, 0 -_0803E178: .4byte gPlayerState -_0803E17C: .4byte 0xFFFFFEFF -_0803E180: .4byte gPlayerEntity -_0803E184: .4byte gUnk_080D0648 - - thumb_func_start sub_0803E188 -sub_0803E188: @ 0x0803E188 - push {lr} - adds r3, r0, #0 - ldr r2, [r3, #0x50] - cmp r2, #0 - beq _0803E19C - ldrb r0, [r2, #0xf] - subs r0, #1 - movs r1, #0 - strb r0, [r2, #0xf] - str r1, [r3, #0x50] -_0803E19C: - adds r0, r3, #0 - bl sub_0804A7D4 - pop {pc} - - thumb_func_start nullsub_19 -nullsub_19: @ 0x0803E1A4 - bx lr - .align 2, 0 - - thumb_func_start sub_0803E1A8 -sub_0803E1A8: @ 0x0803E1A8 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #0 - bne _0803E1F8 - movs r0, #0x4b - movs r1, #1 - bl CreateEnemy - cmp r0, #0 - beq _0803E250 - str r5, [r0, #0x50] - str r0, [r5, #0x54] - ldrb r0, [r5, #0xb] - cmp r0, #0 - bne _0803E1D8 - movs r0, #1 - strb r0, [r5, #0xc] - ldr r0, _0803E1D4 @ =0x0000FFE8 - strh r0, [r5, #0x36] - b _0803E1E8 - .align 2, 0 -_0803E1D4: .4byte 0x0000FFE8 -_0803E1D8: - movs r0, #9 - strb r0, [r5, #0xc] - ldr r0, _0803E1F4 @ =0x0000FF80 - strh r0, [r5, #0x36] - adds r1, r5, #0 - adds r1, #0x3b - movs r0, #1 - strb r0, [r1] -_0803E1E8: - adds r0, r5, #0 - movs r1, #0 - bl InitializeAnimation - b _0803E250 - .align 2, 0 -_0803E1F4: .4byte 0x0000FF80 -_0803E1F8: - movs r0, #8 - strb r0, [r5, #0xc] - ldrb r1, [r5, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r5, #0x10] - adds r1, r5, #0 - adds r1, #0x63 - movs r0, #1 - strb r0, [r1] - ldr r4, [r5, #0x50] - ldrb r2, [r4, #0x1b] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r5, #0x1b] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r5, #0x1b] - ldrb r0, [r4, #0x19] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r5, #0x19] - ands r1, r2 - orrs r1, r0 - strb r1, [r5, #0x19] - adds r2, r5, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] - ldr r0, [r5, #0x50] - ldr r3, _0803E254 @ =0xFFFF0000 - adds r1, r5, #0 - movs r2, #0 - bl PositionRelative - adds r0, r5, #0 - movs r1, #1 - bl InitializeAnimation -_0803E250: - pop {r4, r5, pc} - .align 2, 0 -_0803E254: .4byte 0xFFFF0000 - - thumb_func_start sub_0803E258 -sub_0803E258: @ 0x0803E258 - push {r4, lr} - adds r4, r0, #0 - bl sub_0803E480 - adds r0, r4, #0 - movs r1, #0 - movs r2, #8 - bl PlayerInRange - cmp r0, #0 - beq _0803E280 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0xa - strb r0, [r4, #0xe] - ldr r0, [r4, #0x54] - movs r1, #2 - bl InitializeAnimation - b _0803E29C -_0803E280: - ldr r0, _0803E2A4 @ =gUnk_020000B0 - ldr r1, [r0] - cmp r1, #0 - beq _0803E29C - adds r0, r4, #0 - bl GetFacingDirection - adds r1, r0, #0 - adds r0, r4, #0 - bl sub_08004596 - adds r0, r4, #0 - bl sub_0806F69C -_0803E29C: - adds r0, r4, #0 - bl GetNextFrame - pop {r4, pc} - .align 2, 0 -_0803E2A4: .4byte gUnk_020000B0 - - thumb_func_start sub_0803E2A8 -sub_0803E2A8: @ 0x0803E2A8 - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xe] - cmp r0, #0 - beq _0803E2B8 - subs r0, #1 - strb r0, [r1, #0xe] - b _0803E2C8 -_0803E2B8: - ldrh r0, [r1, #0x36] - adds r0, #1 - strh r0, [r1, #0x36] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _0803E2C8 - movs r0, #3 - strb r0, [r1, #0xc] -_0803E2C8: - adds r0, r1, #0 - bl GetNextFrame - pop {pc} - - thumb_func_start sub_0803E2D0 -sub_0803E2D0: @ 0x0803E2D0 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x54] - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803E312 - ldrh r0, [r4, #0x36] - subs r0, #1 - strh r0, [r4, #0x36] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r1, #0x18 - rsbs r1, r1, #0 - cmp r0, r1 - bgt _0803E30C - movs r0, #4 - strb r0, [r4, #0xc] - bl Random - movs r1, #0xf - ands r0, r1 - adds r0, #0xf - strb r0, [r4, #0xe] - ldr r0, [r4, #0x54] - movs r1, #1 - bl InitializeAnimation -_0803E30C: - adds r0, r4, #0 - bl GetNextFrame -_0803E312: - pop {r4, pc} - - thumb_func_start sub_0803E314 -sub_0803E314: @ 0x0803E314 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0803E332 - movs r0, #1 - strb r0, [r4, #0xc] - ldr r1, _0803E33C @ =gPlayerEntity - adds r0, r4, #0 - bl GetFacingDirection - strb r0, [r4, #0x15] -_0803E332: - adds r0, r4, #0 - bl GetNextFrame - pop {r4, pc} - .align 2, 0 -_0803E33C: .4byte gPlayerEntity - - thumb_func_start sub_0803E340 -sub_0803E340: @ 0x0803E340 - push {r4, lr} - adds r4, r0, #0 - bl sub_0803E444 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _0803E352 - subs r0, #1 - b _0803E36A -_0803E352: - ldrh r0, [r4, #0x36] - subs r0, #1 - strh r0, [r4, #0x36] - lsls r0, r0, #0x10 - asrs r0, r0, #0x10 - movs r1, #0x18 - rsbs r1, r1, #0 - cmp r0, r1 - bgt _0803E36C - movs r0, #6 - strb r0, [r4, #0xc] - movs r0, #0x14 -_0803E36A: - strb r0, [r4, #0xe] -_0803E36C: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0803E370 -sub_0803E370: @ 0x0803E370 - push {lr} - adds r1, r0, #0 - ldrb r0, [r1, #0xe] - subs r0, #1 - strb r0, [r1, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0803E38E - movs r0, #7 - strb r0, [r1, #0xc] - movs r0, #0x10 - strb r0, [r1, #0x15] - movs r0, #0xc0 - lsls r0, r0, #2 - strh r0, [r1, #0x24] -_0803E38E: - adds r0, r1, #0 - bl sub_0803E444 - pop {pc} - .align 2, 0 - - thumb_func_start sub_0803E398 -sub_0803E398: @ 0x0803E398 - push {r4, lr} - adds r4, r0, #0 - bl sub_0803E444 - adds r0, r4, #0 - bl sub_0806F69C - adds r0, r4, #0 - bl sub_0803E4D8 - ldr r1, _0803E3CC @ =gRoomControls - ldrh r0, [r1, #8] - ldrh r1, [r1, #0x20] - adds r0, r0, r1 - subs r0, #0x10 - movs r2, #0x32 - ldrsh r1, [r4, r2] - cmp r0, r1 - bgt _0803E3C8 - bl sub_0805E5A8 - ldr r0, _0803E3D0 @ =gUnk_0813AB94 - bl DoExitTransition -_0803E3C8: - pop {r4, pc} - .align 2, 0 -_0803E3CC: .4byte gRoomControls -_0803E3D0: .4byte gUnk_0813AB94 - - thumb_func_start sub_0803E3D4 -sub_0803E3D4: @ 0x0803E3D4 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x50] - ldr r0, [r0, #4] - cmp r0, #0 - bne _0803E3E4 - bl DeleteThisEntity -_0803E3E4: - ldr r0, [r4, #0x50] - ldr r3, _0803E3F8 @ =0xFFFF0000 - adds r1, r4, #0 - movs r2, #0 - bl PositionRelative - adds r0, r4, #0 - bl GetNextFrame - pop {r4, pc} - .align 2, 0 -_0803E3F8: .4byte 0xFFFF0000 - - thumb_func_start sub_0803E3FC -sub_0803E3FC: @ 0x0803E3FC - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0803E438 @ =gPlayerEntity - ldrh r0, [r1, #0x2e] - strh r0, [r4, #0x2e] - ldrh r0, [r1, #0x32] - strh r0, [r4, #0x32] - ldrh r2, [r4, #0x36] - movs r0, #0x36 - ldrsh r1, [r4, r0] - movs r0, #8 - rsbs r0, r0, #0 - cmp r1, r0 - bge _0803E43C - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #2 - beq _0803E42E - movs r0, #0 - strb r0, [r4, #0xe] - ldr r0, [r4, #0x54] - movs r1, #2 - bl InitializeAnimation -_0803E42E: - adds r0, r4, #0 - bl sub_0803E2A8 - b _0803E442 - .align 2, 0 -_0803E438: .4byte gPlayerEntity -_0803E43C: - adds r0, r2, #0 - adds r0, #8 - strh r0, [r4, #0x36] -_0803E442: - pop {r4, pc} - - thumb_func_start sub_0803E444 -sub_0803E444: @ 0x0803E444 - push {r4, lr} - adds r4, r0, #0 - bl ResetPlayer - ldr r2, _0803E478 @ =gPlayerState - ldrb r1, [r2, #0x1a] - movs r0, #0x80 - orrs r1, r0 - strb r1, [r2, #0x1a] - ldrb r1, [r2, #0xa] - orrs r0, r1 - strb r0, [r2, #0xa] - ldr r1, [r4, #0x4c] - movs r3, #2 - rsbs r3, r3, #0 - adds r0, r4, #0 - movs r2, #0 - bl sub_0806FA90 - ldr r1, _0803E47C @ =gPlayerEntity - adds r1, #0x63 - ldrb r0, [r1] - adds r0, #0xe - strb r0, [r1] - pop {r4, pc} - .align 2, 0 -_0803E478: .4byte gPlayerState -_0803E47C: .4byte gPlayerEntity - - thumb_func_start sub_0803E480 -sub_0803E480: @ 0x0803E480 - push {lr} - adds r3, r0, #0 - adds r2, r3, #0 - adds r2, #0x78 - ldrh r1, [r2] - movs r0, #0x96 - lsls r0, r0, #3 - cmp r1, r0 - bls _0803E49A - movs r0, #0xc0 - lsls r0, r0, #1 - strh r0, [r3, #0x24] - b _0803E49E -_0803E49A: - adds r0, r1, #1 - strh r0, [r2] -_0803E49E: - pop {pc} - - thumb_func_start sub_0803E4A0 -sub_0803E4A0: @ 0x0803E4A0 - push {lr} - adds r1, r0, #0 - ldr r0, _0803E4B8 @ =gScreenTransition - adds r0, #0x39 - ldrb r0, [r0] - cmp r0, #0 - beq _0803E4C6 - ldr r1, [r1, #0x50] - cmp r1, #0 - bne _0803E4BC - movs r0, #0 - b _0803E4D6 - .align 2, 0 -_0803E4B8: .4byte gScreenTransition -_0803E4BC: - adds r0, r1, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - bne _0803E4CA -_0803E4C6: - movs r0, #1 - b _0803E4D6 -_0803E4CA: - movs r2, #0 - ldr r0, [r1, #4] - cmp r0, #0 - bne _0803E4D4 - movs r2, #1 -_0803E4D4: - adds r0, r2, #0 -_0803E4D6: - pop {pc} - - thumb_func_start sub_0803E4D8 -sub_0803E4D8: @ 0x0803E4D8 - push {r4, r5, lr} - movs r2, #0x2e - ldrsh r1, [r0, r2] - ldr r3, _0803E51C @ =gRoomControls - ldrh r2, [r3, #6] - subs r1, r1, r2 - asrs r4, r1, #4 - movs r2, #0x3f - ands r4, r2 - movs r1, #0x32 - ldrsh r0, [r0, r1] - ldrh r1, [r3, #8] - subs r1, #8 - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r4, r0 - ldr r0, _0803E520 @ =gPlayerEntity - adds r5, r0, #0 - adds r5, #0x38 - ldrb r1, [r5] - adds r0, r4, #0 - bl sub_080002E0 - cmp r0, #0xff - beq _0803E518 - ldr r0, _0803E524 @ =0x00004074 - ldrb r2, [r5] - adds r1, r4, #0 - bl SetTile -_0803E518: - pop {r4, r5, pc} - .align 2, 0 -_0803E51C: .4byte gRoomControls -_0803E520: .4byte gPlayerEntity -_0803E524: .4byte 0x00004074 diff --git a/data/const/enemy/vaatiProjectile.s b/data/const/enemy/vaatiProjectile.s deleted file mode 100644 index fb8d37a3..00000000 --- a/data/const/enemy/vaatiProjectile.s +++ /dev/null @@ -1,25 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_080D0648:: @ 080D0648 - .4byte sub_0803E0C4 - .4byte sub_0803E0DC - .4byte sub_08001328 - .4byte sub_0803E188 - .4byte sub_08001242 - .4byte nullsub_19 - -gUnk_080D0660:: @ 080D0660 - .4byte sub_0803E1A8 - .4byte sub_0803E258 - .4byte sub_0803E2A8 - .4byte sub_0803E2D0 - .4byte sub_0803E314 - .4byte sub_0803E340 - .4byte sub_0803E370 - .4byte sub_0803E398 - .4byte sub_0803E3D4 - .4byte sub_0803E3FC diff --git a/linker.ld b/linker.ld index 99325092..98943203 100644 --- a/linker.ld +++ b/linker.ld @@ -417,7 +417,7 @@ SECTIONS { src/enemy/lakituCloud.o(.text); asm/enemy49.o(.text); asm/vaatiRebornEnemy.o(.text); - asm/vaatiProjectile.o(.text); + src/enemy/vaatiProjectile.o(.text); asm/ballChainSoldier.o(.text); src/enemy/enemy4D.o(.text); asm/enemy4D.o(.text); @@ -1122,7 +1122,7 @@ SECTIONS { data/const/enemy/enemy49.o(.rodata); data/const/enemy/vaatiRebornEnemy.o(.rodata); data/animations/enemy/vaatiRebornEnemy.o(.rodata); - data/const/enemy/vaatiProjectile.o(.rodata); + src/enemy/vaatiProjectile.o(.rodata); data/animations/enemy/vaatiProjectile.o(.rodata); data/const/enemy/ballChainSoldier.o(.rodata); data/animations/enemy/ballChainSoldier.o(.rodata); diff --git a/src/enemy/vaatiArm.c b/src/enemy/vaatiArm.c index 3b307128..f766cd99 100644 --- a/src/enemy/vaatiArm.c +++ b/src/enemy/vaatiArm.c @@ -1329,47 +1329,45 @@ void sub_08043D08(Entity* this) { EnqueueSFX(SFX_HIT); } -NONMATCH("asm/non_matching/vaati/sub_08043DB0.inc", void sub_08043DB0(Entity* this)) { +void sub_08043DB0(Entity* this) { s32 cVar1; - u32 uVar2; + Entity* pEVar2; Entity* pEVar3; Entity* pEVar4; - VaatiArm_HeapStruct1* iVar5; - if (((gPlayerState.flags.all & 0x80) != 0) && - (pEVar3 = ((VaatiArm_HeapStruct*)this->myHeap)->entities[3], - uVar2 = CheckPlayerInRegion(pEVar3->x.HALF.HI - gRoomControls.roomOriginX, - pEVar3->y.HALF.HI - gRoomControls.roomOriginY + 2, 3, 3), - uVar2 != 0)) { - DoExitTransition((ScreenTransitionData*)&gUnk_080D13EC); - if ((gScreenTransition.field_0x39 & 3) != 3) { - gScreenTransition.roomID = 1; - } - cVar1 = this->field_0x7a.HWORD / 0x3c; - gScreenTransition.field_0x3d = 0x1e - cVar1; - gScreenTransition.field_0x3c = this->type2; - pEVar3 = ((VaatiArm_HeapStruct*)this->myHeap)->parent; - gScreenTransition.field_0x40 = pEVar3->x.HALF.HI; - gScreenTransition.field_0x42 = pEVar3->y.HALF.HI; - pEVar4 = ((VaatiArm_HeapStruct*)pEVar3->myHeap)->parent; - if (pEVar4 != NULL) { - gScreenTransition.field_0x44 = pEVar4->x.HALF.HI; - gScreenTransition.field_0x46 = pEVar4->y.HALF.HI; - } else { - gScreenTransition.field_0x44 = gRoomControls.roomOriginX + 0x110; - gScreenTransition.field_0x46 = gRoomControls.roomOriginY + 0x60; - } - iVar5 = (VaatiArm_HeapStruct1*)(*(int*)((VaatiArm_HeapStruct*)pEVar3->myHeap)->s1); - if (iVar5 != NULL) { - gScreenTransition.field_0x48 = iVar5[2].unk0e; - gScreenTransition.field_0x4a = iVar5[3].unk02; - } else { - gScreenTransition.field_0x48 = gRoomControls.roomOriginX + 0x110; - gScreenTransition.field_0x4a = gRoomControls.roomOriginY + 0x60; + if (((gPlayerState.flags.all & 0x80) != 0)) { + pEVar3 = ((VaatiArm_HeapStruct*)this->myHeap)->entities[3]; + if (CheckPlayerInRegion(pEVar3->x.HALF.HI - gRoomControls.roomOriginX, + pEVar3->y.HALF.HI - gRoomControls.roomOriginY + 2, 3, 3)) { + DoExitTransition((ScreenTransitionData*)&gUnk_080D13EC); + if ((gScreenTransition.field_0x39 & 3) != 3) { + gScreenTransition.roomID = 1; + } + cVar1 = this->field_0x7a.HWORD; + gScreenTransition.field_0x3d = 0x1e - (cVar1 / 0x3c); + gScreenTransition.field_0x3c = this->type2; + pEVar2 = ((VaatiArm_HeapStruct*)this->myHeap)->parent; + gScreenTransition.field_0x40 = pEVar2->x.HALF.HI; + gScreenTransition.field_0x42 = pEVar2->y.HALF.HI; + pEVar4 = ((VaatiArm_HeapStruct*)pEVar2->myHeap)->parent; + if (pEVar4 != NULL) { + gScreenTransition.field_0x44 = pEVar4->x.HALF.HI; + gScreenTransition.field_0x46 = pEVar4->y.HALF.HI; + } else { + gScreenTransition.field_0x44 = gRoomControls.roomOriginX + 0x110; + gScreenTransition.field_0x46 = gRoomControls.roomOriginY + 0x60; + } + pEVar4 = (Entity*)(*(int*)((VaatiArm_HeapStruct*)pEVar2->myHeap)->s1); + if (pEVar4 != NULL) { + gScreenTransition.field_0x48 = pEVar4->x.HALF.HI; + gScreenTransition.field_0x4a = pEVar4->y.HALF.HI; + } else { + gScreenTransition.field_0x48 = gRoomControls.roomOriginX + 0x110; + gScreenTransition.field_0x4a = gRoomControls.roomOriginY + 0x60; + } } } } -END_NONMATCH void sub_08043EB8(Entity* this) { u32 i; diff --git a/src/enemy/vaatiProjectile.c b/src/enemy/vaatiProjectile.c new file mode 100644 index 00000000..03914d2f --- /dev/null +++ b/src/enemy/vaatiProjectile.c @@ -0,0 +1,262 @@ +#include "global.h" +#include "enemy.h" +#include "random.h" +#include "functions.h" + +extern bool32 PlayerInRange(Entity*, u32, u32); +extern void DoExitTransition(ScreenTransitionData*); +extern u32 sub_080002E0(u32, u32); +extern Entity* gUnk_020000B0; +extern const ScreenTransitionData gUnk_0813AB94; + +bool32 sub_0803E4A0(Entity*); +void sub_0803E0C4(Entity*); +void sub_0803E0DC(Entity*); +void sub_08001328(Entity*); +void sub_0803E188(Entity*); +void nullsub_19(Entity*); +void sub_0803E1A8(Entity*); +void sub_0803E258(Entity*); +void sub_0803E2A8(Entity*); +void sub_0803E2D0(Entity*); +void sub_0803E314(Entity*); +void sub_0803E340(Entity*); +void sub_0803E370(Entity*); +void sub_0803E398(Entity*); +void sub_0803E3D4(Entity*); +void sub_0803E3FC(Entity*); +void sub_0803E444(Entity*); +void sub_0803E480(Entity*); +void sub_0803E4D8(Entity*); + +void (*const gUnk_080D0648[])(Entity*) = { + sub_0803E0C4, sub_0803E0DC, sub_08001328, sub_0803E188, sub_08001242, nullsub_19, +}; +void (*const gUnk_080D0660[])(Entity*) = { + sub_0803E1A8, sub_0803E258, sub_0803E2A8, sub_0803E2D0, sub_0803E314, + sub_0803E340, sub_0803E370, sub_0803E398, sub_0803E3D4, sub_0803E3FC, +}; + +void VaatiProjectile(Entity* this) { + if (sub_0803E4A0(this)) { + this->flags &= 0x7f; + this->currentHealth = 0; + this->parent = NULL; + } + gUnk_080D0648[GetNextFunction(this)](this); +} + +void sub_0803E0C4(Entity* this) { + gUnk_080D0660[this->action](this); +} + +void sub_0803E0DC(Entity* this) { + Entity* entity; + + if (this->bitfield == 0x80) { + if (this->currentHealth != 0) { + this->action = 5; + this->flags = this->flags & 0x7f; + this->spritePriority.b1 = 0; + gPlayerEntity.flags &= 0x7f; + gPlayerEntity.spriteOrientation.flipY = this->spriteOrientation.flipY; + gPlayerEntity.spriteRendering.b3 = this->spriteRendering.b3; + sub_0803E444(this); + sub_08078A90(2); + entity = this->parent; + if (entity != NULL) { + entity->flags = entity->flags & 0x7f; + } + } else { + gPlayerState.flags.all &= 0xfffffeff; // using b.unk8 does not match + entity = &gPlayerEntity; + entity->flags = gPlayerEntity.flags | 0x80; + } + } + sub_0804AA30(this, gUnk_080D0648); +} + +void sub_0803E188(Entity* this) { + if (this->parent != NULL) { + this->parent->field_0xf--; + this->parent = NULL; + } + sub_0804A7D4(this); +} + +void nullsub_19(Entity* this) { +} + +void sub_0803E1A8(Entity* this) { + Entity* entity; + + if (this->type == 0) { + entity = CreateEnemy(VAATI_PROJECTILE, 1); + if (entity != NULL) { + entity->parent = this; + this->attachedEntity = entity; + if (this->type2 == 0) { + this->action = 1; + this->height.HALF.HI = -0x18; + } else { + this->action = 9; + this->height.HALF.HI = -0x80; + this->flags2 = 1; + } + InitializeAnimation(this, 0); + } + } else { + this->action = 8; + this->flags = this->flags & 0x7f; + this->spriteOffsetY = 1; + this->spriteOrientation.flipY = this->parent->spriteOrientation.flipY; + this->spriteRendering.b3 = this->parent->spriteRendering.b3; + this->spritePriority.b1 = 0; + PositionRelative(this->parent, this, 0, -0x10000); + InitializeAnimation(this, 1); + } +} + +void sub_0803E258(Entity* this) { + sub_0803E480(this); + if (PlayerInRange(this, 0, 8) != 0) { + this->action = 2; + this->actionDelay = 10; + InitializeAnimation(this->attachedEntity, 2); + } else { + if (gUnk_020000B0 != NULL) { + sub_08004596(this, GetFacingDirection(this, gUnk_020000B0)); + sub_0806F69C(this); + } + } + GetNextFrame(this); +} + +void sub_0803E2A8(Entity* this) { + if (this->actionDelay != 0) { + this->actionDelay--; + } else { + if (++this->height.HALF.HI == 0) { + this->action = 3; + } + } + GetNextFrame(this); +} + +void sub_0803E2D0(Entity* this) { + if ((this->attachedEntity->frames.b.f3) != 0) { + if (--this->height.HALF.HI <= -0x18) { + this->action = 4; + this->actionDelay = (Random() & 0xf) + 0xf; + InitializeAnimation(this->attachedEntity, 1); + } + GetNextFrame(this); + } +} + +void sub_0803E314(Entity* this) { + if (--this->actionDelay == 0) { + this->action = 1; + this->direction = GetFacingDirection(this, &gPlayerEntity); + } + GetNextFrame(this); +} + +void sub_0803E340(Entity* this) { + sub_0803E444(this); + if (this->actionDelay != 0) { + this->actionDelay--; + } else { + if (-0x18 < --this->height.HALF.HI) { + return; + } + this->action = 6; + this->actionDelay = 0x14; + } +} + +void sub_0803E370(Entity* this) { + if (--this->actionDelay == 0) { + this->action = 7; + this->direction = 0x10; + this->speed = 0x300; + } + sub_0803E444(this); +} + +void sub_0803E398(Entity* this) { + sub_0803E444(this); + sub_0806F69C(this); + sub_0803E4D8(this); + if ((gRoomControls.roomOriginY + gRoomControls.height + -0x10) <= this->y.HALF.HI) { + sub_0805E5A8(); + DoExitTransition((ScreenTransitionData*)&gUnk_0813AB94); + } +} + +void sub_0803E3D4(Entity* this) { + if (this->parent->next == NULL) { + DeleteThisEntity(); + } + PositionRelative(this->parent, this, 0, -0x10000); + GetNextFrame(this); +} + +void sub_0803E3FC(Entity* this) { + this->x.HALF.HI = gPlayerEntity.x.HALF.HI; + this->y.HALF.HI = gPlayerEntity.y.HALF.HI; + if (this->height.HALF.HI < -8) { + if (this->animIndex != 2) { + this->actionDelay = 0; + InitializeAnimation(this->attachedEntity, 2); + } + sub_0803E2A8(this); + } else { + this->height.HALF.HI += 8; + } +} + +void sub_0803E444(Entity* this) { + ResetPlayer(); + gPlayerState.field_0x1a[0] = gPlayerState.field_0x1a[0] | 0x80; + gPlayerState.field_0xa = gPlayerState.field_0xa | 0x80; + sub_0806FA90(this, this->field_0x4c, 0, -2); + gPlayerEntity.spriteOffsetY += 0xe; +} + +void sub_0803E480(Entity* this) { + if (this->field_0x78.HWORD >= 0x4b1) { + this->speed = 0x180; + } else { + this->field_0x78.HWORD++; + } +} + +bool32 sub_0803E4A0(Entity* this) { + bool32 ret; + if (gScreenTransition.field_0x39 != 0) { + if (this->parent == NULL) { + return FALSE; + } + if (this->parent->currentHealth == 0) { + return TRUE; + } else { + ret = FALSE; + if (this->parent->next == NULL) { + ret = TRUE; + } + } + } else { + return TRUE; + } + return ret; +} + +void sub_0803E4D8(Entity* this) { + u32 tile; + + tile = TILE(this->x.HALF.HI, this->y.HALF.HI + 8); + if (sub_080002E0(tile, gPlayerEntity.collisionLayer) != 0xff) { + SetTile(0x4074, tile, gPlayerEntity.collisionLayer); + } +}