From 7e7e1525b9006c67ccdea915c6216c3685434511 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sun, 6 Feb 2022 01:27:03 +0100 Subject: [PATCH] Decompile Enemy50 --- asm/enemy/enemy50.s | 1119 ------------------------------------ assets/assets.json | 10 - data/const/enemy/enemy50.s | 37 -- include/enemy.h | 2 +- linker.ld | 4 +- src/enemy/enemy50.c | 461 +++++++++++++++ 6 files changed, 464 insertions(+), 1169 deletions(-) delete mode 100644 asm/enemy/enemy50.s delete mode 100644 data/const/enemy/enemy50.s create mode 100644 src/enemy/enemy50.c diff --git a/asm/enemy/enemy50.s b/asm/enemy/enemy50.s deleted file mode 100644 index a586a922..00000000 --- a/asm/enemy/enemy50.s +++ /dev/null @@ -1,1119 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Enemy50 -Enemy50: @ 0x08040B2C -.ifdef EU - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #1 - bne _08040A5E - ldr r0, [r5, #0x50] - ldr r0, [r0, #4] - cmp r0, #0 - bne _08040A5E - ldrb r0, [r5, #0xc] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bhi _08040A50 - adds r0, r5, #0 - bl sub_0803F6EC -_08040A50: - adds r0, r5, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - bl DeleteThisEntity -_08040A5E: - ldr r4, _08040A84 @ =gUnk_080D0DC4 - 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 - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r5, #0 - movs r1, #0 - movs r2, #1 - bl SetChildOffset - pop {r4, r5, pc} - .align 2, 0 -_08040A84: .4byte gUnk_080D0DC4 -.else - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r0, [r5, #0xa] - cmp r0, #1 - bne _08040B5C - ldr r0, [r5, #0x50] - ldr r0, [r0, #4] - cmp r0, #0 - bne _08040B5C - adds r0, r5, #0 - bl sub_08041300 - cmp r0, #0 - beq _08040B4E - adds r0, r5, #0 - bl sub_0803F6EC -_08040B4E: - adds r0, r5, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - bl DeleteThisEntity -_08040B5C: - ldr r4, _08040B80 @ =gUnk_080D0DC4 - 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 - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r5, #0 - movs r1, #0 - movs r2, #1 - bl SetChildOffset - pop {r4, r5, pc} - .align 2, 0 -_08040B80: .4byte gUnk_080D0DC4 -.endif - - thumb_func_start sub_08040B84 -sub_08040B84: @ 0x08040B84 - push {lr} - ldr r2, _08040B98 @ =gUnk_080D0DDC - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08040B98: .4byte gUnk_080D0DDC - - thumb_func_start sub_08040B9C -sub_08040B9C: @ 0x08040B9C - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bhi _08040BD0 - movs r0, #0xff - strb r0, [r4, #0x14] - adds r0, r4, #0 - adds r0, #0x3e - ldrb r1, [r0] - lsrs r1, r1, #4 - movs r0, #1 - eors r1, r0 - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - bl sub_08041134 - adds r0, r4, #0 - bl sub_0803F6EC -_08040BD0: - adds r0, r4, #0 - adds r0, #0x3f - ldrb r0, [r0] - cmp r0, #0x25 - bne _08040BF4 - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - adds r5, r0, #0 - cmp r1, #0x80 - bne _08040C0E - movs r0, #8 - strb r0, [r4, #0xc] - adds r0, r4, #0 - movs r1, #3 - bl InitializeAnimation - b _08040C9C -_08040BF4: - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - adds r5, r0, #0 - cmp r1, #0x80 - bne _08040C0E - adds r1, r4, #0 - adds r1, #0x7c - movs r0, #0x78 - strh r0, [r1] - adds r0, r4, #0 - bl sub_08041128 -_08040C0E: - ldrb r0, [r5] - cmp r0, #0x9d - bne _08040C1A - movs r0, #0xc0 - lsls r0, r0, #9 - str r0, [r4, #0x20] -_08040C1A: - adds r0, r4, #0 - adds r0, #0x43 - ldrb r0, [r0] - cmp r0, #0 - beq _08040C40 - adds r0, r4, #0 - adds r0, #0x3e - ldrb r0, [r0] - lsrs r0, r0, #4 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r1, #7 - adds r0, r4, #0 - bl InitializeAnimation - adds r0, r4, #0 - movs r1, #0x1c - bl sub_0804A9FC -_08040C40: - adds r0, r4, #0 - adds r0, #0x45 - adds r1, r4, #0 - adds r1, #0x7a - ldrb r2, [r0] - adds r6, r0, #0 - adds r5, r1, #0 - ldrb r0, [r5] - cmp r2, r0 - beq _08040C9C - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08040C70 - adds r0, r4, #0 - adds r0, #0x3e - ldrb r0, [r0] - lsrs r0, r0, #4 - strb r0, [r4, #0x14] - ldrb r1, [r4, #0x14] - adds r1, #7 - adds r0, r4, #0 - bl InitializeAnimation - b _08040C98 -_08040C70: - adds r1, r4, #0 - adds r1, #0x3d - ldrb r2, [r1] - movs r0, #0 - ldrsb r0, [r1, r0] - cmp r0, #0 - ble _08040C84 - movs r0, #0x80 - orrs r0, r2 - strb r0, [r1] -_08040C84: - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - movs r0, #0xff - strb r0, [r6] - movs r0, #0xa - strb r0, [r4, #0xc] - movs r0, #0x3c - strb r0, [r4, #0xe] -_08040C98: - ldrb r0, [r6] - strb r0, [r5] -_08040C9C: - ldr r1, _08040CA8 @ =gUnk_080D0DC4 - adds r0, r4, #0 - bl sub_0804AA30 - pop {r4, r5, r6, pc} - .align 2, 0 -_08040CA8: .4byte gUnk_080D0DC4 - - thumb_func_start sub_08040CAC -sub_08040CAC: @ 0x08040CAC - push {r4, r5, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - bl sub_08001328 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08040D04 - adds r0, r4, #0 - adds r0, #0x42 - ldrb r0, [r0] - cmp r0, #0 - bne _08040D2C - adds r0, r4, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - beq _08040D2C - adds r0, r4, #0 - adds r0, #0x43 - ldrb r0, [r0] - cmp r0, #0 - bne _08040D2C - movs r0, #0xff - strb r0, [r4, #0x14] - adds r1, r4, #0 - adds r1, #0x58 - ldrb r0, [r1] - subs r0, #7 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bhi _08040D2C - ldrb r1, [r1] - subs r1, #7 - movs r0, #1 - eors r1, r0 - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation - b _08040D2C -_08040D04: - ldrb r2, [r4, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #1 - eors r1, r0 - movs r5, #4 - rsbs r5, r5, #0 - adds r3, r5, #0 - ands r3, r2 - orrs r3, r1 - strb r3, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x42 - ldrb r0, [r0] - cmp r0, #0 - bne _08040D2C - ands r3, r5 - movs r0, #1 - orrs r3, r0 - strb r3, [r4, #0x18] -_08040D2C: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08040D30 -sub_08040D30: @ 0x08040D30 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x58 - ldrb r0, [r0] - subs r0, #7 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bls _08040D4C - ldrb r1, [r4, #0x14] - adds r1, #7 - adds r0, r4, #0 - bl InitializeAnimation -_08040D4C: - adds r0, r4, #0 - bl sub_08001242 - ldrh r1, [r4, #0x36] - movs r2, #0x36 - ldrsh r0, [r4, r2] - cmp r0, #0 - bne _08040D60 - ldr r0, _08040D8C @ =0x0000FFFF - strh r0, [r4, #0x36] -_08040D60: - adds r0, r4, #0 - adds r0, #0x43 - ldrb r0, [r0] - cmp r0, #0 - bne _08040D88 - ldrb r0, [r4, #0x14] - movs r1, #1 - eors r1, r0 - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation - movs r0, #0xff - strb r0, [r4, #0x15] - movs r0, #1 - rsbs r0, r0, #0 - strb r0, [r4, #0x14] - adds r0, r4, #0 - bl sub_08041134 -_08040D88: - pop {r4, pc} - .align 2, 0 -_08040D8C: .4byte 0x0000FFFF - - thumb_func_start sub_08040D90 -sub_08040D90: @ 0x08040D90 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F520 - cmp r0, #0 - beq _08040DB4 - ldr r0, _08040DB0 @ =gUnk_080D0E08 - ldrb r1, [r4, #0xd] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - b _08040DC6 - .align 2, 0 -_08040DB0: .4byte gUnk_080D0E08 -_08040DB4: - adds r0, r4, #0 - bl sub_08041128 - ldrb r1, [r4, #0x15] - lsrs r1, r1, #4 - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation -_08040DC6: - pop {r4, pc} - - thumb_func_start sub_08040DC8 -sub_08040DC8: @ 0x08040DC8 - push {lr} - movs r1, #1 - strb r1, [r0, #0xd] - movs r1, #0x3c - strb r1, [r0, #0x1d] - ldr r1, _08040DE0 @ =gPlayerEntity - ldrb r1, [r1, #0x14] - lsrs r1, r1, #2 - adds r1, #5 - bl InitializeAnimation - pop {pc} - .align 2, 0 -_08040DE0: .4byte gPlayerEntity - - thumb_func_start sub_08040DE4 -sub_08040DE4: @ 0x08040DE4 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - bl sub_0806F4E8 - pop {r4, pc} - - thumb_func_start sub_08040DF4 -sub_08040DF4: @ 0x08040DF4 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _08040E38 - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - cmp r0, #0 - beq _08040E26 - adds r2, r0, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r2] -_08040E26: - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08040E34 - adds r0, r4, #0 - bl sub_0804A7D4 - b _08040E38 -_08040E34: - bl DeleteThisEntity -_08040E38: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08040E3C -sub_08040E3C: @ 0x08040E3C - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_0804A720 - bl Random - movs r2, #0x1e - adds r1, r0, #0 - ands r1, r2 - movs r2, #0 - strb r1, [r4, #0x15] - movs r1, #0xff - strb r1, [r4, #0x14] - movs r5, #1 - strb r5, [r4, #0x1c] - adds r1, r4, #0 - adds r1, #0x45 - ldrb r1, [r1] - adds r3, r4, #0 - adds r3, #0x7a - strb r1, [r3] - lsrs r0, r0, #4 - adds r1, r4, #0 - adds r1, #0x7b - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x7c - strh r2, [r0] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08040E86 - strb r5, [r4, #0xc] - ldrb r0, [r4, #0xe] - bl GetCurrentRoomProperty - str r0, [r4, #0x54] - b _08040E8C -_08040E86: - adds r0, r4, #0 - bl sub_080411CC -_08040E8C: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08040E90 -sub_08040E90: @ 0x08040E90 - push {r4, lr} - adds r4, r0, #0 - bl sub_080411E8 - cmp r0, #0 - beq _08040EA4 - movs r0, #2 - strb r0, [r4, #0xc] - movs r0, #0xf - strb r0, [r4, #0xe] -_08040EA4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08040EA8 -sub_08040EA8: @ 0x08040EA8 - 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 _08040EC4 - adds r0, r4, #0 - bl sub_080411CC - adds r0, r4, #0 - bl sub_0804122C -_08040EC4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08040EC8 -sub_08040EC8: @ 0x08040EC8 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08040F08 - ldrb r1, [r4, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r4, #0x10] - bl Random - adds r1, r4, #0 - adds r1, #0x80 - ldrb r2, [r1] - movs r1, #0x30 - ands r1, r0 - adds r1, #0x3c - adds r0, r2, #0 - muls r0, r1, r0 - adds r0, #0x78 - adds r1, r4, #0 - adds r1, #0x7c - strh r0, [r1] - adds r0, r4, #0 - bl sub_08041128 -_08040F08: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08040F0C -sub_08040F0C: @ 0x08040F0C - push {r4, lr} - adds r4, r0, #0 - bl sub_08041170 - cmp r0, #0 - bne _08040F36 - adds r0, r4, #0 - bl sub_0803F58C - adds r0, r4, #0 - bl GetNextFrame - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08040F36 - adds r0, r4, #0 - bl sub_08041128 -_08040F36: - pop {r4, pc} - - thumb_func_start sub_08040F38 -sub_08040F38: @ 0x08040F38 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - movs r1, #1 - bl sub_08049F84 - strb r0, [r4, #0x15] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xff - beq _08040F8E - adds r0, r4, #0 - bl sub_0803F66C - adds r1, r4, #0 - adds r1, #0x78 - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - bne _08040F94 - movs r0, #6 - strb r0, [r4, #0xc] - bl Random - movs r2, #0xe0 - adds r1, r0, #0 - ands r1, r2 - strb r1, [r4, #0xe] - movs r1, #0x80 - lsls r1, r1, #1 - strh r1, [r4, #0x24] - lsrs r0, r0, #8 - movs r1, #0x78 - ands r0, r1 - adds r0, #0x3c - adds r1, r4, #0 - adds r1, #0x7e - strh r0, [r1] - b _08040F94 -_08040F8E: - adds r0, r4, #0 - bl sub_08041128 -_08040F94: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08040F98 -sub_08040F98: @ 0x08040F98 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - bl sub_0803F5A8 - cmp r0, #0 - bne _08040FB2 - adds r0, r4, #0 - bl sub_08041128 - b _08041014 -_08040FB2: - movs r0, #1 - bl sub_08049DF4 - cmp r0, #0 - beq _0804100C - adds r1, r4, #0 - adds r1, #0x7e - ldrh r0, [r1] - subs r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0804100C - ldrb r1, [r4, #0xe] - adds r1, #1 - strb r1, [r4, #0xe] - ldr r2, _08041004 @ =gUnk_080D0E14 - lsls r0, r1, #0x18 - lsrs r0, r0, #0x1e - adds r0, r0, r2 - ldrb r0, [r0] - ands r1, r0 - cmp r1, #0 - bne _08040FF4 - ldr r0, _08041008 @ =gUnk_020000B0 - ldr r1, [r0] - adds r0, r4, #0 - bl GetFacingDirection - adds r1, r0, #0 - adds r0, r4, #0 - bl sub_08004596 -_08040FF4: - adds r0, r4, #0 - bl sub_0803F66C - adds r0, r4, #0 - bl sub_080AEFB4 - b _08041014 - .align 2, 0 -_08041004: .4byte gUnk_080D0E14 -_08041008: .4byte gUnk_020000B0 -_0804100C: - movs r0, #7 - strb r0, [r4, #0xc] - movs r0, #0x1e - strb r0, [r4, #0xe] -_08041014: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08041018 -sub_08041018: @ 0x08041018 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08041042 - bl Random - movs r1, #0xf8 - ands r0, r1 - adds r0, #0xb4 - adds r1, r4, #0 - adds r1, #0x7c - strh r0, [r1] - adds r0, r4, #0 - bl sub_08041128 -_08041042: - pop {r4, pc} - - thumb_func_start sub_08041044 -sub_08041044: @ 0x08041044 - push {r4, lr} - adds r4, r0, #0 - bl sub_0803F738 - adds r0, r4, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08041074 - movs r0, #0 - movs r1, #9 - strb r1, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x78 - strh r0, [r1] - adds r0, r4, #0 - movs r1, #4 - bl InitializeAnimation -_08041074: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08041078 -sub_08041078: @ 0x08041078 - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #1 - ands r0, r1 - cmp r0, #0 - beq _08041094 - adds r0, r4, #0 - bl sub_0803F6C0 -_08041094: - bl sub_0807953C - adds r1, r4, #0 - adds r1, #0x78 - cmp r0, #0 - beq _080410A6 - ldrh r0, [r1] - adds r0, #8 - strh r0, [r1] -_080410A6: - ldr r2, _08041100 @ =gPlayerEntity - adds r0, r2, #0 - adds r0, #0x45 - ldrb r0, [r0] - cmp r0, #0 - bne _080410B6 - movs r0, #0xe0 - strh r0, [r1] -_080410B6: - ldrh r0, [r1] - adds r0, #1 - strh r0, [r1] - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - cmp r0, #0xdf - bls _08041104 - adds r1, r4, #0 - adds r1, #0x7c - movs r0, #0x78 - strh r0, [r1] - movs r0, #0xff - strb r0, [r4, #0x14] - subs r1, #0x3f - movs r0, #0xf4 - strb r0, [r1] - adds r1, #5 - movs r0, #0x14 - strb r0, [r1] - adds r1, #4 - movs r0, #0xc0 - lsls r0, r0, #1 - strh r0, [r1] - ldrb r0, [r2, #0x14] - lsls r0, r0, #2 - movs r1, #0x10 - eors r0, r1 - adds r1, r4, #0 - adds r1, #0x3e - strb r0, [r1] - adds r0, r4, #0 - bl sub_08041128 - adds r0, r4, #0 - bl sub_0803F6EC - b _0804110A - .align 2, 0 -_08041100: .4byte gPlayerEntity -_08041104: - adds r0, r4, #0 - bl sub_0803F738 -_0804110A: - pop {r4, pc} - - thumb_func_start sub_0804110C -sub_0804110C: @ 0x0804110C - push {r4, lr} - adds r4, r0, #0 - bl GetNextFrame - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08041126 - adds r0, r4, #0 - bl sub_08041128 -_08041126: - pop {r4, pc} - - thumb_func_start sub_08041128 -sub_08041128: @ 0x08041128 - push {lr} - movs r1, #4 - strb r1, [r0, #0xc] - bl sub_0803F528 - pop {pc} - - thumb_func_start sub_08041134 -sub_08041134: @ 0x08041134 - push {r4, r5, lr} - adds r4, r0, #0 - movs r0, #5 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0x25 - strb r0, [r1] - movs r5, #0 - ldr r0, _08041168 @ =gPlayerClones - ldr r0, [r0] - cmp r0, #0 - beq _08041150 - movs r5, #0x3c -_08041150: - bl Random - ldr r2, _0804116C @ =gUnk_080D0E18 - movs r1, #3 - ands r1, r0 - adds r1, r1, r2 - ldrb r0, [r1] - adds r0, r0, r5 - adds r1, r4, #0 - adds r1, #0x78 - strh r0, [r1] - pop {r4, r5, pc} - .align 2, 0 -_08041168: .4byte gPlayerClones -_0804116C: .4byte gUnk_080D0E18 - - thumb_func_start sub_08041170 -sub_08041170: @ 0x08041170 - push {r4, lr} - adds r4, r0, #0 - adds r1, r4, #0 - adds r1, #0x7c - ldrh r0, [r1] - cmp r0, #0 - beq _08041184 - subs r0, #1 - strh r0, [r1] - b _080411C8 -_08041184: - adds r0, r4, #0 - movs r1, #1 - bl sub_08049FDC - cmp r0, #0 - beq _080411C8 - adds r0, r4, #0 - bl sub_0806FD54 - cmp r0, #0 - bne _080411B6 - ldr r0, _080411C0 @ =gArea - movs r1, #0xa - ldrsh r0, [r0, r1] - cmp r0, #0xf - ble _080411C8 - ldr r0, _080411C4 @ =gUnk_020000B0 - ldr r1, [r0] - adds r0, r4, #0 - movs r2, #0x70 - movs r3, #0x48 - bl EntityInRectRadius - cmp r0, #0 - beq _080411C8 -_080411B6: - adds r0, r4, #0 - bl sub_08041134 - movs r0, #1 - b _080411CA - .align 2, 0 -_080411C0: .4byte gArea -_080411C4: .4byte gUnk_020000B0 -_080411C8: - movs r0, #0 -_080411CA: - pop {r4, pc} - - thumb_func_start sub_080411CC -sub_080411CC: @ 0x080411CC - push {lr} - movs r1, #3 - strb r1, [r0, #0xc] - ldrb r2, [r0, #0x18] - subs r1, #7 - ands r1, r2 - movs r2, #1 - orrs r1, r2 - strb r1, [r0, #0x18] - movs r1, #0 - bl InitializeAnimation - pop {pc} - .align 2, 0 - - thumb_func_start sub_080411E8 -sub_080411E8: @ 0x080411E8 - push {r4, lr} - adds r4, r0, #0 - movs r1, #1 - bl sub_08049FDC - cmp r0, #0 - beq _08041222 - ldrb r0, [r4, #0xb] - cmp r0, #1 - beq _08041204 - cmp r0, #2 - beq _08041218 -_08041200: - movs r0, #1 - b _08041224 -_08041204: - ldr r0, _08041214 @ =gPlayerState - ldr r0, [r0, #0x30] - movs r1, #0x80 - lsls r1, r1, #0x10 - ands r0, r1 - cmp r0, #0 - beq _08041222 - b _08041200 - .align 2, 0 -_08041214: .4byte gPlayerState -_08041218: - ldr r0, _08041228 @ =gArea - movs r1, #0xa - ldrsh r0, [r0, r1] - cmp r0, #0xf - bgt _08041200 -_08041222: - movs r0, #0 -_08041224: - pop {r4, pc} - .align 2, 0 -_08041228: .4byte gArea - - thumb_func_start sub_0804122C -sub_0804122C: @ 0x0804122C - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r4, r0, #0 - ldr r0, [r4, #0x54] - mov r8, r0 - bl Random - movs r6, #6 - ands r6, r0 - lsrs r5, r0, #8 - movs r0, #3 - ands r5, r0 - movs r7, #0 - ldr r3, _080412FC @ =gRoomControls - mov sb, r3 -_08041250: - movs r0, #0x50 - movs r1, #1 - bl CreateEnemy - adds r2, r0, #0 - cmp r2, #0 - beq _080412C8 - lsls r1, r6, #1 - add r1, r8 - mov r3, sb - ldrh r0, [r3, #6] - ldrh r3, [r1] - adds r0, r0, r3 - strh r0, [r2, #0x2e] - mov r3, sb - ldrh r0, [r3, #8] - ldrh r1, [r1, #2] - adds r0, r0, r1 - strh r0, [r2, #0x32] - str r4, [r2, #0x50] - adds r0, r2, #0 - adds r0, #0x80 - strb r5, [r0] - adds r3, r2, #0 - adds r3, #0x6d - ldrb r0, [r3] - movs r1, #4 - orrs r0, r1 - strb r0, [r3] - adds r0, r4, #0 - adds r0, #0x70 - ldrh r1, [r0] - adds r0, r2, #0 - adds r0, #0x70 - strh r1, [r0] - adds r0, r4, #0 - adds r0, #0x72 - ldrh r0, [r0] - adds r1, r2, #0 - adds r1, #0x72 - strh r0, [r1] - adds r0, r4, #0 - adds r0, #0x6e - ldrb r0, [r0] - subs r1, #4 - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x6f - ldrb r0, [r0] - adds r1, #1 - strb r0, [r1] - adds r0, r2, #0 - bl ResolveCollisionLayer - adds r6, #2 - movs r0, #6 - ands r6, r0 - adds r5, #1 - movs r0, #3 - ands r5, r0 -_080412C8: - adds r7, #1 - cmp r7, #2 - bls _08041250 - lsls r1, r6, #1 - add r1, r8 - ldr r2, _080412FC @ =gRoomControls - ldrh r0, [r2, #6] - ldrh r3, [r1] - adds r0, r0, r3 - movs r3, #0 - strh r0, [r4, #0x2e] - ldrh r0, [r2, #8] - ldrh r1, [r1, #2] - adds r0, r0, r1 - strh r0, [r4, #0x32] - adds r0, r4, #0 - adds r0, #0x38 - strb r3, [r0] - adds r0, r4, #0 - bl ResolveCollisionLayer - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080412FC: .4byte gRoomControls - -.ifndef EU - thumb_func_start sub_08041300 -sub_08041300: @ 0x08041300 - push {lr} - adds r1, r0, #0 - adds r0, #0x3f - ldrb r0, [r0] - cmp r0, #0x25 - bne _0804131A - adds r0, r1, #0 - adds r0, #0x41 - ldrb r0, [r0] - cmp r0, #0x80 - bne _0804131A - movs r0, #1 - b _0804132C -_0804131A: - movs r2, #0 - ldrb r0, [r1, #0xc] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #1 - bhi _0804132A - movs r2, #1 -_0804132A: - adds r0, r2, #0 -_0804132C: - pop {pc} - .align 2, 0 -.endif diff --git a/assets/assets.json b/assets/assets.json index 706dcd76..428a69b2 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -27731,16 +27731,6 @@ "size": 15, "type": "animation" }, - { - "path": "enemy50/gUnk_080D0E14.bin", - "start": 855572, - "size": 4 - }, - { - "path": "enemy50/gUnk_080D0E18.bin", - "start": 855576, - "size": 4 - }, { "path": "animations/gSpriteAnimations_VaatiWrath_0.bin", "start": 855760, diff --git a/data/const/enemy/enemy50.s b/data/const/enemy/enemy50.s deleted file mode 100644 index bedd3e7c..00000000 --- a/data/const/enemy/enemy50.s +++ /dev/null @@ -1,37 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_080D0DC4:: @ 080D0DC4 - .4byte sub_08040B84 - .4byte sub_08040B9C - .4byte sub_08040CAC - .4byte sub_0804A7D4 - .4byte sub_08040D30 - .4byte sub_08040D90 - -gUnk_080D0DDC:: @ 080D0DDC - .4byte sub_08040E3C - .4byte sub_08040E90 - .4byte sub_08040EA8 - .4byte sub_08040EC8 - .4byte sub_08040F0C - .4byte sub_08040F38 - .4byte sub_08040F98 - .4byte sub_08041018 - .4byte sub_08041044 - .4byte sub_08041078 - .4byte sub_0804110C - -gUnk_080D0E08:: @ 080D0E08 - .4byte sub_08040DC8 - .4byte sub_08040DE4 - .4byte sub_08040DF4 - -gUnk_080D0E14:: @ 080D0E14 - .incbin "enemy50/gUnk_080D0E14.bin" - -gUnk_080D0E18:: @ 080D0E18 - .incbin "enemy50/gUnk_080D0E18.bin" diff --git a/include/enemy.h b/include/enemy.h index 4bbecfec..80e27186 100644 --- a/include/enemy.h +++ b/include/enemy.h @@ -213,7 +213,7 @@ void BallChainSoldier(Entity*); void Enemy4D(Entity*); void Ghini(Entity*); void VaatiTransfigured(Entity*); -void Enemy50(Entity*); +void Enemy50(); void VaatiWrath(Entity*); void VaatiArm(Entity*); void Dust(Entity*); diff --git a/linker.ld b/linker.ld index d1126618..7188fc0c 100644 --- a/linker.ld +++ b/linker.ld @@ -406,7 +406,7 @@ SECTIONS { asm/enemy/enemy4D.o(.text); asm/enemy/ghini.o(.text); src/enemy/vaatiTransfigured.o(.text); - asm/enemy/enemy50.o(.text); + src/enemy/enemy50.o(.text); src/enemy/vaatiWrath.o(.text); src/enemy/vaatiArm.o(.text); asm/enemy/dust.o(.text); @@ -1085,7 +1085,7 @@ SECTIONS { data/animations/enemy/ghini.o(.rodata); src/enemy/vaatiTransfigured.o(.rodata); data/animations/enemy/vaatiTransfigured.o(.rodata); - data/const/enemy/enemy50.o(.rodata); + src/enemy/enemy50.o(.rodata); src/enemy/vaatiWrath.o(.rodata); data/animations/enemy/vaatiWrath.o(.rodata); src/enemy/vaatiArm.o(.rodata); diff --git a/src/enemy/enemy50.c b/src/enemy/enemy50.c new file mode 100644 index 00000000..e248ec16 --- /dev/null +++ b/src/enemy/enemy50.c @@ -0,0 +1,461 @@ +/** + * @file enemy50.c + * @ingroup Enemies + * + * @brief Enemy50 enemy + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "enemy.h" +#include "functions.h" +#include "area.h" +#include "player.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[0x5]; + /*0x6d*/ u8 unk_6d; + /*0x6e*/ u8 unk_6e; + /*0x6f*/ u8 unk_6f; + /*0x70*/ u16 unk_70; + /*0x72*/ u16 unk_72; + /*0x74*/ u8 unk_74[0x4]; + /*0x78*/ u16 unk_78; + /*0x7a*/ u8 unk_7a; + /*0x7b*/ u8 unk_7b; + /*0x7c*/ u16 unk_7c; + /*0x7e*/ u16 unk_7e; + /*0x80*/ u8 unk_80; +} Enemy50Entity; + +extern Entity* gUnk_020000B0; + +extern void sub_0803F58C(Enemy50Entity*); +extern void sub_0803F6EC(Enemy50Entity*); +extern void sub_0803F66C(Enemy50Entity*); +extern bool32 sub_0803F5A8(Enemy50Entity*); +extern void sub_0803F66C(Enemy50Entity*); +extern void sub_0803F738(Enemy50Entity*); +extern void sub_0803F6C0(Enemy50Entity*); +extern void sub_0803F528(Enemy50Entity*); +extern bool32 sub_0806FD54(Entity*); + +extern void (*const Enemy50_Functions[])(Enemy50Entity*); +extern void (*const Enemy50_Actions[])(Enemy50Entity*); +extern void (*const Enemy50_SubActions[])(Enemy50Entity*); +extern const u8 gUnk_080D0E14[]; +extern const u8 gUnk_080D0E18[]; + +bool32 sub_08041300(Enemy50Entity*); +void sub_08041134(Enemy50Entity*); +void sub_08041128(Enemy50Entity*); +void sub_080411CC(Enemy50Entity*); +bool32 sub_080411E8(Enemy50Entity*); +void sub_0804122C(Enemy50Entity*); +bool32 sub_08041170(Enemy50Entity*); + +void Enemy50(Enemy50Entity* this) { + if ((super->type == 1) && ((super->parent)->next == NULL)) { +#ifdef EU + if (super->action == 8 || super->action == 9) { +#else + if (sub_08041300(this)) { +#endif + sub_0803F6EC(this); + } + CreateFx(super, FX_DEATH, 0); + DeleteThisEntity(); + } + Enemy50_Functions[GetNextFunction(super)](this); + SetChildOffset(super, 0, 1, -0x10); +} + +void Enemy50_OnTick(Enemy50Entity* this) { + Enemy50_Actions[super->action](this); +} + +void sub_08040B9C(Enemy50Entity* this) { + if (super->action == 8 || super->action == 9) { + super->animationState = 0xff; + InitializeAnimation(super, (super->knockbackDirection >> 4 ^ 1) + 1); + sub_08041134(this); + sub_0803F6EC(this); + } + if (super->hitType == 0x25) { + if (super->bitfield == 0x80) { + super->action = 8; + InitializeAnimation(super, 3); + goto _08040C9C; + } + } else if (super->bitfield == 0x80) { + this->unk_7c = 0x78; + sub_08041128(this); + } + if (super->bitfield == 0x9d) { + super->zVelocity = 0x18000; + } + if (super->field_0x43 != 0) { + super->animationState = super->knockbackDirection >> 4; + InitializeAnimation(super, super->animationState + 7); + sub_0804A9FC(super, 0x1c); + } + if (super->health != this->unk_7a) { + if (super->type == 0) { + super->animationState = super->knockbackDirection >> 4; + InitializeAnimation(super, super->animationState + 7); + } else { + if (super->iframes > 0) { + *((u8*)&super->iframes) |= 0x80; + } + super->flags |= 0x80; + super->health = 0xff; + super->action = 0xa; + super->actionDelay = 0x3c; + } + this->unk_7a = super->health; + } +_08040C9C: + sub_0804AA30(super, Enemy50_Functions); +} + +void sub_08040CAC(Enemy50Entity* this) { + GetNextFrame(super); + sub_08001328(super); + if (super->type == 0) { + if (((super->knockbackDuration == 0) && (super->health != 0)) && (super->field_0x43 == 0)) { + super->animationState = 0xff; + if (super->animIndex == 7 || super->animIndex == 8) { + InitializeAnimation(super, ((super->animIndex - 7) ^ 1) + 1); + } + } + } else { + super->spriteSettings.draw ^= 1; + if (super->knockbackDuration == 0) { + super->spriteSettings.draw = 1; + } + } +} + +void sub_08040D30(Enemy50Entity* this) { + if (super->animIndex != 7 && super->animIndex != 8) { + InitializeAnimation(super, super->animationState + 7); + } + sub_08001242(super); + if (super->z.HALF.HI == 0) { + super->z.HALF.HI = 0xffff; + } + if (super->field_0x43 == 0) { + InitializeAnimation(super, (super->animationState ^ 1) + 1); + super->direction = 0xff; + super->animationState = 0xff; + sub_08041134(this); + } +} + +void sub_08040D90(Enemy50Entity* this) { + if (sub_0806F520()) { + Enemy50_SubActions[super->subAction](this); + } else { + sub_08041128(this); + InitializeAnimation(super, (super->direction >> 4) + 1); + } +} + +void Enemy50_SubAction0(Enemy50Entity* this) { + super->subAction = 1; + super->field_0x1d = 0x3c; + InitializeAnimation(super, (gPlayerEntity.animationState >> 2) + 5); +} + +void Enemy50_SubAction1(Enemy50Entity* this) { + GetNextFrame(super); + sub_0806F4E8(super); +} + +void Enemy50_SubAction2(Enemy50Entity* this) { + GetNextFrame(super); + if (sub_0806F3E4(super)) { + Entity* effect = CreateFx(super, FX_DEATH, 0); + if (effect != NULL) { + effect->spritePriority.b0 = 3; + } + if (super->type == 0) { + sub_0804A7D4(super); + } else { + DeleteThisEntity(); + } + } +} + +void Enemy50_Init(Enemy50Entity* this) { + u32 rand; + + sub_0804A720(super); + rand = Random(); + super->direction = rand & 0x1e; + super->animationState = 0xff; + super->field_0x1c = 1; + this->unk_7a = super->health; + this->unk_7b = rand >> 4; + this->unk_7c = 0; + if (super->type == 0) { + super->action = 1; + super->child = (Entity*)GetCurrentRoomProperty(super->actionDelay); + } else { + sub_080411CC(this); + } +} + +void Enemy50_Action1(Enemy50Entity* this) { + if (sub_080411E8(this)) { + super->action = 2; + super->actionDelay = 0x0f; + } +} + +void Enemy50_Action2(Enemy50Entity* this) { + if (--super->actionDelay == 0) { + sub_080411CC(this); + sub_0804122C(this); + } +} + +void Enemy50_Action3(Enemy50Entity* this) { + GetNextFrame(super); + if ((super->frame & 0x80) != 0) { + super->flags |= 0x80; + this->unk_7c = this->unk_80 * ((Random() & 0x30) + 0x3c) + 0x78; + sub_08041128(this); + } +} + +void Enemy50_Action4(Enemy50Entity* this) { + if (sub_08041170(this) == 0) { + sub_0803F58C(this); + GetNextFrame(super); + if (--super->actionDelay == 0) { + sub_08041128(this); + } + } +} + +void Enemy50_Action5(Enemy50Entity* this) { + u32 rand; + + GetNextFrame(super); + super->direction = sub_08049F84(super, 1); + if (super->direction != 0xff) { + sub_0803F66C(this); + if (--this->unk_78 == 0) { + super->action = 6; + rand = Random(); + super->actionDelay = rand & 0xe0; + super->speed = 0x100; + this->unk_7e = ((rand >> 8) & 0x78) + 0x3c; + } + } else { + sub_08041128(this); + } +} + +void Enemy50_Action6(Enemy50Entity* this) { + u32 tmp; + + GetNextFrame(super); + if (sub_0803F5A8(this) == 0) { + sub_08041128(this); + } else { + if (!((sub_08049DF4(1) == 0) || (--this->unk_7e == 0))) { + tmp = super->actionDelay + 1; + super->actionDelay = tmp; + if ((tmp & gUnk_080D0E14[tmp * 0x1000000 >> 0x1e]) == 0) { + sub_08004596(super, GetFacingDirection(super, gUnk_020000B0)); + } + sub_0803F66C(this); + sub_080AEFB4(super); + } else { + super->action = 7; + super->actionDelay = 0x1e; + } + } +} + +void Enemy50_Action7(Enemy50Entity* this) { + GetNextFrame(super); + if (--super->actionDelay == 0) { + this->unk_7c = (Random() & 0xf8) + 0xb4; + sub_08041128(this); + } +} + +void Enemy50_Action8(Enemy50Entity* this) { + sub_0803F738(this); + GetNextFrame(super); + if ((super->frame & 0x80) != 0) { + super->action = 9; + this->unk_78 = 0; + InitializeAnimation(super, 4); + } +} + +void Enemy50_Action9(Enemy50Entity* this) { + GetNextFrame(super); + if ((super->frame & 1) != 0) { + sub_0803F6C0(this); + } + if (sub_0807953C()) { + this->unk_78 += 8; + } + if (gPlayerEntity.health == 0) { + this->unk_78 = 0xe0; + } + this->unk_78++; + if (this->unk_78 >= 0xe0) { + this->unk_7c = 0x78; + super->animationState = 0xff; + super->iframes = -0xc; + super->knockbackDuration = 0x14; + super->field_0x46 = 0x180; + super->knockbackDirection = gPlayerEntity.animationState << 2 ^ 0x10; + sub_08041128(this); + sub_0803F6EC(this); + } else { + sub_0803F738(this); + } +} + +void Enemy50_Action10(Enemy50Entity* this) { + GetNextFrame(super); + if (--super->actionDelay == 0) { + sub_08041128(this); + } +} + +void sub_08041128(Enemy50Entity* this) { + super->action = 4; + sub_0803F528(this); +} + +void sub_08041134(Enemy50Entity* this) { + s16 tmp; + + super->action = 5; + super->hitType = 0x25; + tmp = 0; + if (gPlayerClones[0] != NULL) { + tmp = 0x3c; + } + this->unk_78 = gUnk_080D0E18[Random() & 3] + tmp; +} + +bool32 sub_08041170(Enemy50Entity* this) { + if (this->unk_7c != 0) { + this->unk_7c--; + } else { + if ((sub_08049FDC(super, 1)) && + ((sub_0806FD54(super) || + ((0xf < (s16)gArea.unk_0a && (EntityInRectRadius(super, gUnk_020000B0, 0x70, 0x48))))))) { + sub_08041134(this); + return TRUE; + } + } + return FALSE; +} + +void sub_080411CC(Enemy50Entity* this) { + super->action = 3; + super->spriteSettings.draw = 1; + InitializeAnimation(super, 0); +} + +bool32 sub_080411E8(Enemy50Entity* this) { + if (sub_08049FDC(super, 1) != 0) { + switch (super->type2) { + case 1: + if ((gPlayerState.flags & PL_USE_LANTERN) == 0) { + return FALSE; + } + return TRUE; + case 2: + if ((s16)gArea.unk_0a < 0x10) { + return FALSE; + } + return TRUE; + default: + return TRUE; + } + } else { + return FALSE; + } +} + +void sub_0804122C(Enemy50Entity* this) { + s16* child; + u32 rand; + Enemy50Entity* enemy; + u32 tmpA; + u32 tmpB; + u32 index; + + child = (s16*)super->child; + rand = Random(); + tmpB = rand & 6; + tmpA = rand >> 8 & 3; + for (index = 0; index < 3; index++) { + enemy = (Enemy50Entity*)CreateEnemy(ENEMY_50, 1); + if (enemy != NULL) { + (enemy->base).x.HALF.HI = child[tmpB + 0] + gRoomControls.origin_x; + (enemy->base).y.HALF.HI = child[tmpB + 1] + gRoomControls.origin_y; + (enemy->base).parent = super; + enemy->unk_80 = tmpA; + enemy->unk_6d |= 4; + enemy->unk_70 = this->unk_70; + enemy->unk_72 = this->unk_72; + enemy->unk_6e = this->unk_6e; + enemy->unk_6f = this->unk_6f; + ResolveCollisionLayer(&enemy->base); + tmpB = (tmpB + 2) & 6; + tmpA = (tmpA + 1) & 3; + } + } + super->x.HALF.HI = child[tmpB + 0] + gRoomControls.origin_x; + super->y.HALF.HI = child[tmpB + 1] + gRoomControls.origin_y; + super->collisionLayer = 0; + ResolveCollisionLayer(super); +} + +#ifndef EU +bool32 sub_08041300(Enemy50Entity* this) { + if ((super->hitType == 0x25) && (super->bitfield == 0x80)) { + return TRUE; + } else { + return super->action == 8 || super->action == 9; + } +} +#endif + +void (*const Enemy50_Functions[])(Enemy50Entity*) = { + Enemy50_OnTick, sub_08040B9C, sub_08040CAC, (void (*)(Enemy50Entity*))sub_0804A7D4, sub_08040D30, sub_08040D90, +}; +void (*const Enemy50_Actions[])(Enemy50Entity*) = { + Enemy50_Init, Enemy50_Action1, Enemy50_Action2, Enemy50_Action3, Enemy50_Action4, Enemy50_Action5, + Enemy50_Action6, Enemy50_Action7, Enemy50_Action8, Enemy50_Action9, Enemy50_Action10, +}; +void (*const Enemy50_SubActions[])(Enemy50Entity*) = { + Enemy50_SubAction0, + Enemy50_SubAction1, + Enemy50_SubAction2, +}; +const u8 gUnk_080D0E14[] = { + 15, + 7, + 3, + 1, +}; +const u8 gUnk_080D0E18[] = { + 15, + 25, + 34, + 45, +};