From 607c32ac5e4164514b63dda5cc5c523a56546b35 Mon Sep 17 00:00:00 2001 From: 21aslade <21aslade@go.dsdmail.net> Date: Wed, 1 Jul 2020 12:03:23 -0600 Subject: [PATCH] lakitu.c OK Also changed some parts of the entity struct and created trig.h --- asm/lakitu.s | 748 ---------------------------------------------- include/entity.h | 4 +- include/trig.h | 7 + linker.ld | 2 +- src/keese.c | 14 +- src/lakitu.c | 429 ++++++++++++++++++++++++++ src/lakituCloud.c | 4 +- src/mask.c | 4 +- 8 files changed, 450 insertions(+), 762 deletions(-) delete mode 100644 asm/lakitu.s create mode 100644 include/trig.h create mode 100644 src/lakitu.c diff --git a/asm/lakitu.s b/asm/lakitu.s deleted file mode 100644 index 6faceee6..00000000 --- a/asm/lakitu.s +++ /dev/null @@ -1,748 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start Lakitu -Lakitu: @ 0x0803C738 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0803C754 @ =gUnk_080D0110 - bl EnemyFunctionHandler - movs r3, #0x10 - rsbs r3, r3, #0 - adds r0, r4, #0 - movs r1, #0 - movs r2, #1 - bl SetChildOffset - pop {r4, pc} - .align 2, 0 -_0803C754: .4byte gUnk_080D0110 - - thumb_func_start sub_0803C758 -sub_0803C758: @ 0x0803C758 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xc] - cmp r0, #0 - beq _0803C76C - cmp r0, #7 - beq _0803C76C - adds r0, r4, #0 - bl sub_0803CAD0 -_0803C76C: - ldr r0, _0803C780 @ =gUnk_080D0128 - ldrb r1, [r4, #0xc] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 - pop {r4, pc} - .align 2, 0 -_0803C780: .4byte gUnk_080D0128 - - thumb_func_start sub_0803C784 -sub_0803C784: @ 0x0803C784 - push {r4, r5, lr} - adds r4, r0, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x1d - bne _0803C7A2 - movs r0, #0x80 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - adds r0, r4, #0 - bl sub_0803CBAC - b _0803C7FA -_0803C7A2: - adds r0, r4, #0 - adds r0, #0x3f - ldrb r0, [r0] - cmp r0, #0x43 - bne _0803C7FA - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _0803C7FA - adds r0, r4, #0 - adds r0, #0x3e - ldrb r1, [r0] - movs r0, #0x10 - eors r0, r1 - lsls r1, r0, #3 - ldr r3, _0803C818 @ =gSineTable - lsls r0, r0, #4 - adds r0, r0, r3 - movs r5, #0 - ldrsh r0, [r0, r5] - cmp r0, #0 - bge _0803C7D8 - adds r0, #0x1f -_0803C7D8: - asrs r0, r0, #5 - ldrh r5, [r2, #0x2e] - adds r0, r0, r5 - strh r0, [r2, #0x2e] - adds r0, r1, #0 - adds r0, #0x40 - lsls r0, r0, #1 - adds r0, r0, r3 - movs r1, #0 - ldrsh r0, [r0, r1] - cmp r0, #0 - bge _0803C7F2 - adds r0, #0x1f -_0803C7F2: - asrs r1, r0, #5 - ldrh r0, [r2, #0x32] - subs r0, r0, r1 - strh r0, [r2, #0x32] -_0803C7FA: - adds r0, r4, #0 - adds r0, #0x43 - ldrb r0, [r0] - cmp r0, #0 - beq _0803C80C - adds r0, r4, #0 - movs r1, #0x1c - bl sub_0804A9FC -_0803C80C: - ldr r1, _0803C81C @ =gUnk_080D0110 - adds r0, r4, #0 - bl sub_0804AA30 - pop {r4, r5, pc} - .align 2, 0 -_0803C818: .4byte gSineTable -_0803C81C: .4byte gUnk_080D0110 - - thumb_func_start sub_0803C820 -sub_0803C820: @ 0x0803C820 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F520 - cmp r0, #0 - beq _0803C83C - ldr r0, _0803C840 @ =gUnk_080D0148 - ldrb r1, [r4, #0xd] - lsls r1, r1, #2 - adds r1, r1, r0 - ldr r1, [r1] - adds r0, r4, #0 - bl _call_via_r1 -_0803C83C: - pop {r4, pc} - .align 2, 0 -_0803C840: .4byte gUnk_080D0148 - - thumb_func_start sub_0803C844 -sub_0803C844: @ 0x0803C844 - movs r1, #1 - strb r1, [r0, #0xd] - movs r1, #0x3c - strb r1, [r0, #0x1d] - bx lr - .align 2, 0 - - thumb_func_start sub_0803C850 -sub_0803C850: @ 0x0803C850 - push {lr} - adds r2, r0, #0 - ldr r0, [r2, #0x54] - cmp r0, #0 - beq _0803C864 - adds r1, r2, #0 - adds r1, #0x62 - ldrb r1, [r1] - adds r0, #0x62 - strb r1, [r0] -_0803C864: - adds r0, r2, #0 - bl sub_0806F4E8 - pop {pc} - - thumb_func_start sub_0803C86C -sub_0803C86C: @ 0x0803C86C - push {r4, lr} - adds r4, r0, #0 - bl sub_0803CBAC - movs r0, #0 - str r0, [r4, #0x54] - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0803C87C -sub_0803C87C: @ 0x0803C87C - push {r4, lr} - adds r4, r0, #0 - movs r1, #0x11 - movs r2, #0 - bl sub_0804A98C - cmp r0, #0 - beq _0803C8B4 - str r4, [r0, #0x50] - str r0, [r4, #0x54] - adds r0, r4, #0 - bl sub_0804A720 - movs r0, #1 - strb r0, [r4, #0xc] - ldr r0, _0803C8B8 @ =0x0000FFFE - strh r0, [r4, #0x36] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #0xff - strb r0, [r1] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x74 - strh r1, [r0] - ldrh r1, [r4, #0x32] - adds r0, #2 - strh r1, [r0] -_0803C8B4: - pop {r4, pc} - .align 2, 0 -_0803C8B8: .4byte 0x0000FFFE - - thumb_func_start sub_0803C8BC -sub_0803C8BC: @ 0x0803C8BC - push {r4, lr} - adds r4, r0, #0 - movs r1, #0 - bl sub_0803CA84 - adds r0, r4, #0 - bl sub_0803CA4C - cmp r0, #0 - beq _0803C8E0 - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #6 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] -_0803C8E0: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0803C8E4 -sub_0803C8E4: @ 0x0803C8E4 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803C914 - movs r0, #3 - strb r0, [r4, #0xc] - movs r0, #0x3c - strb r0, [r4, #0xe] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0x42 - strb r0, [r1] - ldrb r1, [r4, #0x14] - adds r1, #4 - adds r0, r4, #0 - bl InitAnimationForceUpdate -_0803C914: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0803C918 -sub_0803C918: @ 0x0803C918 - push {r4, lr} - adds r4, r0, #0 - bl sub_0803CB04 - cmp r0, #0 - bne _0803C94E - adds r0, r4, #0 - bl sub_0803CA4C - cmp r0, #0 - bne _0803C946 - movs r0, #4 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0x43 - strb r0, [r1] - ldrb r1, [r4, #0x14] - adds r1, #0xc - adds r0, r4, #0 - bl InitAnimationForceUpdate - b _0803C94E -_0803C946: - adds r0, r4, #0 - movs r1, #4 - bl sub_0803CA84 -_0803C94E: - pop {r4, pc} - - thumb_func_start sub_0803C950 -sub_0803C950: @ 0x0803C950 - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803C97A - movs r0, #1 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x18] - subs r0, #5 - ands r0, r1 - strb r0, [r4, #0x18] - ldrb r1, [r4, #0x14] - adds r0, r4, #0 - bl InitAnimationForceUpdate -_0803C97A: - pop {r4, pc} - - thumb_func_start sub_0803C97C -sub_0803C97C: @ 0x0803C97C - push {r4, lr} - adds r4, r0, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0803C9D2 - adds r0, r4, #0 - bl sub_0803CB64 - movs r0, #6 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0x42 - strb r0, [r1] - bl Random - movs r1, #1 - ands r0, r1 - adds r2, r4, #0 - adds r2, #0x79 - cmp r0, #0 - beq _0803C9C2 - ldrb r0, [r2] - cmp r0, #0 - bne _0803C9C2 - movs r0, #0xf - strb r0, [r4, #0xe] - strb r1, [r2] - b _0803C9D2 -_0803C9C2: - movs r1, #0 - movs r0, #0x1e - strb r0, [r4, #0xe] - strb r1, [r2] - ldr r0, [r4, #0x54] - ldrb r1, [r4, #0x14] - bl InitAnimationForceUpdate -_0803C9D2: - pop {r4, pc} - - thumb_func_start sub_0803C9D4 -sub_0803C9D4: @ 0x0803C9D4 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0803CA08 - adds r0, r2, #0 - adds r0, #0x79 - ldrb r0, [r0] - cmp r0, #1 - bne _0803C9F6 - adds r0, r2, #0 - bl sub_0803CB34 - b _0803CA08 -_0803C9F6: - movs r0, #3 - strb r0, [r2, #0xc] - movs r0, #0xb4 - strb r0, [r2, #0xe] - ldrb r1, [r2, #0x14] - adds r1, #4 - adds r0, r2, #0 - bl InitAnimationForceUpdate -_0803CA08: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0803CA0C -sub_0803CA0C: @ 0x0803CA0C - push {r4, lr} - adds r4, r0, #0 - movs r1, #0xc0 - lsls r1, r1, #5 - bl sub_08003FC4 - cmp r0, #0 - bne _0803CA3E - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #0x13 - bhi _0803CA3E - ldrb r1, [r4, #0x14] - adds r1, #0x14 - adds r0, r4, #0 - bl InitAnimationForceUpdate - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r2] -_0803CA3E: - adds r0, r4, #0 - bl UpdateAnimationSingleFrame - adds r0, r4, #0 - bl sub_0803CC08 - pop {r4, pc} - - thumb_func_start sub_0803CA4C -sub_0803CA4C: @ 0x0803CA4C - push {r4, r5, lr} - adds r5, r0, #0 - ldr r4, _0803CA7C @ =gLinkEntity - movs r0, #0x2e - ldrsh r1, [r4, r0] - movs r0, #0x32 - ldrsh r2, [r4, r0] - adds r0, r5, #0 - movs r3, #0x28 - bl sub_0806FCB8 - cmp r0, #0 - bne _0803CA80 - adds r0, r5, #0 - adds r1, r4, #0 - movs r2, #0x70 - movs r3, #0x50 - bl sub_080041A0 - cmp r0, #0 - beq _0803CA80 - movs r0, #1 - b _0803CA82 - .align 2, 0 -_0803CA7C: .4byte gLinkEntity -_0803CA80: - movs r0, #0 -_0803CA82: - pop {r4, r5, pc} - - thumb_func_start sub_0803CA84 -sub_0803CA84: @ 0x0803CA84 - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r6, r1, #0 - ldr r1, _0803CACC @ =gLinkEntity - bl sub_080045C4 - adds r4, r0, #0 - subs r0, r4, #3 - movs r1, #7 - ands r0, r1 - cmp r0, #2 - bhi _0803CAAA - ldrb r0, [r5, #0x14] - lsrs r1, r4, #3 - subs r0, r0, r1 - movs r1, #3 - ands r0, r1 - cmp r0, #1 - bls _0803CACA -_0803CAAA: - adds r0, r4, #4 - movs r1, #0x18 - ands r0, r1 - lsrs r4, r0, #3 - ldrb r0, [r5, #0x14] - cmp r4, r0 - beq _0803CACA - strb r4, [r5, #0x14] - adds r1, r4, r6 - adds r0, r5, #0 - bl InitAnimationForceUpdate - ldr r0, [r5, #0x54] - adds r1, r4, #0 - bl InitAnimationForceUpdate -_0803CACA: - pop {r4, r5, r6, pc} - .align 2, 0 -_0803CACC: .4byte gLinkEntity - - thumb_func_start sub_0803CAD0 -sub_0803CAD0: @ 0x0803CAD0 - push {r4, r5, r6, lr} - adds r4, r0, #0 - adds r6, r4, #0 - adds r6, #0x74 - ldrh r1, [r6] - adds r5, r4, #0 - adds r5, #0x76 - ldrh r2, [r5] - movs r3, #1 - bl sub_0806FCB8 - cmp r0, #0 - bne _0803CB02 - movs r1, #0x2e - ldrsh r0, [r4, r1] - movs r2, #0x32 - ldrsh r1, [r4, r2] - ldrh r2, [r6] - ldrh r3, [r5] - bl sub_080045D4 - strb r0, [r4, #0x15] - adds r0, r4, #0 - bl sub_080AEFE0 -_0803CB02: - pop {r4, r5, r6, pc} - - thumb_func_start sub_0803CB04 -sub_0803CB04: @ 0x0803CB04 - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - lsrs r5, r0, #0x18 - cmp r5, #0 - beq _0803CB1A - movs r0, #0 - b _0803CB32 -_0803CB1A: - adds r0, r4, #0 - bl sub_0803CB34 - adds r0, r4, #0 - adds r0, #0x79 - strb r5, [r0] - ldr r0, [r4, #0x54] - ldrb r1, [r4, #0x14] - adds r1, #4 - bl InitAnimationForceUpdate - movs r0, #1 -_0803CB32: - pop {r4, r5, pc} - - thumb_func_start sub_0803CB34 -sub_0803CB34: @ 0x0803CB34 - push {r4, lr} - adds r4, r0, #0 - movs r0, #5 - strb r0, [r4, #0xc] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0xa6 - strb r0, [r1] - ldr r1, _0803CB60 @ =gLinkEntity - adds r0, r4, #0 - bl sub_080045C4 - adds r1, r4, #0 - adds r1, #0x78 - strb r0, [r1] - ldrb r1, [r4, #0x14] - adds r1, #8 - adds r0, r4, #0 - bl InitAnimationForceUpdate - pop {r4, pc} - .align 2, 0 -_0803CB60: .4byte gLinkEntity - - thumb_func_start sub_0803CB64 -sub_0803CB64: @ 0x0803CB64 - push {r4, r5, lr} - adds r4, r0, #0 - movs r1, #0x12 - movs r2, #0 - bl sub_0804A98C - adds r5, r0, #0 - cmp r5, #0 - beq _0803CBA0 - ldrb r1, [r4, #0x14] - lsls r1, r1, #1 - ldr r0, _0803CBA4 @ =gUnk_080D0154 - adds r1, r1, r0 - adds r0, r4, #0 - adds r0, #0x78 - ldrb r0, [r0] - strb r0, [r5, #0x15] - movs r2, #0 - ldrsb r2, [r1, r2] - lsls r2, r2, #0x10 - movs r3, #1 - ldrsb r3, [r1, r3] - lsls r3, r3, #0x10 - adds r0, r4, #0 - adds r1, r5, #0 - bl PositionRelative - ldr r0, _0803CBA8 @ =0x00000193 - bl sub_08004488 -_0803CBA0: - pop {r4, r5, pc} - .align 2, 0 -_0803CBA4: .4byte gUnk_080D0154 -_0803CBA8: .4byte 0x00000193 - - thumb_func_start sub_0803CBAC -sub_0803CBAC: @ 0x0803CBAC - push {lr} - adds r3, r0, #0 - ldr r2, [r3, #0x54] - cmp r2, #0 - beq _0803CBC6 - ldrb r1, [r2, #0x10] - movs r0, #0x80 - orrs r0, r1 - strb r0, [r2, #0x10] - adds r1, r2, #0 - adds r1, #0x3f - movs r0, #0x43 - strb r0, [r1] -_0803CBC6: - movs r0, #7 - strb r0, [r3, #0xc] - ldrb r1, [r3, #0x18] - subs r0, #0xb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r3, #0x18] - adds r2, r3, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #8 - orrs r0, r1 - strb r0, [r2] - adds r2, #0x12 - ldrb r1, [r2] - movs r0, #0x7b - ands r0, r1 - strb r0, [r2] - adds r1, r3, #0 - adds r1, #0x3f - movs r0, #0x42 - strb r0, [r1] - ldrb r1, [r3, #0x14] - adds r1, #0x10 - adds r0, r3, #0 - bl InitAnimationForceUpdate - pop {pc} - .align 2, 0 - - thumb_func_start sub_0803CC08 -sub_0803CC08: @ 0x0803CC08 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r5, [r4, #0x54] - cmp r5, #0 - beq _0803CCB4 - movs r1, #0x36 - ldrsh r0, [r5, r1] - movs r2, #0x36 - ldrsh r1, [r4, r2] - subs r0, r0, r1 - cmp r0, #2 - bhi _0803CCB4 - ldr r0, [r4, #0x20] - cmp r0, #0 - bge _0803CCB4 - movs r0, #0x2e - ldrsh r1, [r5, r0] - movs r0, #0x32 - ldrsh r2, [r5, r0] - adds r0, r4, #0 - movs r3, #6 - bl sub_0806FCB8 - cmp r0, #0 - beq _0803CCB4 - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0803CC56 - ldrh r0, [r1, #0x2e] - adds r0, #6 - strh r0, [r1, #0x2e] - ldrh r0, [r1, #0x32] - adds r0, #6 - strh r0, [r1, #0x32] -_0803CC56: - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0803CC72 - ldrh r0, [r1, #0x2e] - subs r0, #6 - strh r0, [r1, #0x2e] - ldrh r0, [r1, #0x32] - adds r0, #6 - strh r0, [r1, #0x32] -_0803CC72: - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0803CC8E - ldrh r0, [r1, #0x2e] - adds r0, #6 - strh r0, [r1, #0x2e] - ldrh r0, [r1, #0x32] - subs r0, #6 - strh r0, [r1, #0x32] -_0803CC8E: - adds r0, r4, #0 - movs r1, #2 - movs r2, #0 - bl CreateFx - adds r1, r0, #0 - cmp r1, #0 - beq _0803CCAA - ldrh r0, [r1, #0x2e] - subs r0, #6 - strh r0, [r1, #0x2e] - ldrh r0, [r1, #0x32] - subs r0, #6 - strh r0, [r1, #0x32] -_0803CCAA: - movs r0, #0 - str r0, [r4, #0x54] - adds r0, r5, #0 - bl DeleteEntity -_0803CCB4: - pop {r4, r5, pc} - .align 2, 0 diff --git a/include/entity.h b/include/entity.h index ceab7355..c912c917 100644 --- a/include/entity.h +++ b/include/entity.h @@ -142,8 +142,8 @@ typedef struct Entity { u8 field_0x6d; u8 filler4[6]; u16 field_0x74; - u8 filler5[2]; - u16 field_0x78; + u16 field_0x76; + union SplitHWord field_0x78; u16 field_0x7a; union SplitWord field_0x7c; u16 field_0x80; diff --git a/include/trig.h b/include/trig.h new file mode 100644 index 00000000..0e6e44a9 --- /dev/null +++ b/include/trig.h @@ -0,0 +1,7 @@ +#ifndef TRIG_H +#define TRIG_H + +extern const s16 gSineTable[]; +extern const s16 gCosineTable[]; + +#endif diff --git a/linker.ld b/linker.ld index cab720d2..c8ecad9c 100644 --- a/linker.ld +++ b/linker.ld @@ -394,7 +394,7 @@ SECTIONS { asm/takkuri.o(.text); src/bowMoblin.o(.text); asm/bowMoblin.o(.text); - asm/lakitu.o(.text); + src/lakitu.o(.text); src/lakituCloud.o(.text); asm/enemy49.o(.text); asm/vaatiRebornEnemy.o(.text); diff --git a/src/keese.c b/src/keese.c index 0c846a79..a000ab80 100644 --- a/src/keese.c +++ b/src/keese.c @@ -4,9 +4,9 @@ #include "link.h" extern void sub_0804AA30(Entity*, void *); -extern u32 sub_0806F520(void); +extern u32 sub_0806F520(Entity*); extern void sub_0806F4E8(Entity*); -extern u32 sub_0806F3E4(void); +extern u32 sub_0806F3E4(Entity*); extern void sub_0804A7D4(Entity*); extern void sub_0804A720(Entity*); extern u32 Random(); @@ -45,7 +45,7 @@ void sub_08021d98(Entity *this) void sub_08021DA8(Entity *this) { - if (sub_0806F520()) { + if (sub_0806F520(this)) { gUnk_080CB6C4[this->previousActionFlag](this); } } @@ -62,7 +62,7 @@ void sub_08021DD4(Entity *this) void sub_08021DDC(Entity *this) { - if (sub_0806F3E4()) { + if (sub_0806F3E4(this)) { sub_0804A7D4(this); } } @@ -85,8 +85,8 @@ void sub_08021DF0(Entity *this) void sub_08021E4C(Entity *this) { - if (this->field_0x78 != 0) { - this->field_0x78--; + if (this->field_0x78.HWORD != 0) { + this->field_0x78.HWORD--; } if (this->field_0x7a != 0) { (this->field_0x7a)--; @@ -128,7 +128,7 @@ void sub_08021EF0(Entity *this) u32 uVar1; this->action = 1; - this->field_0x78 = gUnk_080CB6D6[Random() & 0xf]; + this->field_0x78.HWORD = gUnk_080CB6D6[Random() & 0xf]; this->field_0x7a = 0x3c; InitializeAnimation(this, 0); } diff --git a/src/lakitu.c b/src/lakitu.c new file mode 100644 index 00000000..9c7c41d6 --- /dev/null +++ b/src/lakitu.c @@ -0,0 +1,429 @@ +#include "global.h" +#include "entity.h" +#include "trig.h" +#include "random.h" +#include "link.h" + +// Lakitu +extern void EnemyFunctionHandler(Entity *, void (*const funcs[])(Entity*)); +extern void SetChildOffset(Entity *, u32, u32, u32); + +// sub_0803C758 +extern void sub_0803CAD0(Entity *); + +// sub_0803C784 +extern void sub_0803CBAC(Entity *); // Also used in sub_0803C86C +extern Entity *CreateFx(Entity*, u32, u32); +extern void sub_0804A9FC(Entity *, u32); +extern void sub_0804AA30(Entity *, void (*const funcs[])(Entity *)); + +// sub_0803C820 +extern u32 sub_0806F520(Entity *); + +// sub_0803C850 +extern void sub_0806F4E8(Entity *); + +// sub_0803C87C +extern Entity *sub_0804A98C(Entity *, u32, u32); +extern void sub_0804A720(Entity *); + +// sub_0803C8BC and sub_0803C918 +extern void sub_0803CA84(Entity *, u32); +extern bool32 sub_0803CA4C(Entity *); + +// Many functions +extern void UpdateAnimationSingleFrame(Entity *); +extern void InitAnimationForceUpdate(Entity *, u32); + +// sub_0803C918 +extern u32 sub_0803CB04(Entity *); + +// sub_0803C97C +extern void sub_0803CB64(Entity *); + +// sub_0803C9D4 and sub_0803CB04 +extern void sub_0803CB34(Entity *); + +// sub_0803CA0C +extern u32 sub_08003FC4(Entity *, u32); +extern void sub_0803CC08(Entity *this); + +// sub_0803CA4C +extern u32 sub_0806FCB8(Entity *, u32, u32, u32); +extern u32 sub_080041A0(Entity *, Entity *, u32, u32); + +// sub_0803CA84 +extern u32 sub_080045C4(Entity *, Entity *); + +// sub_0803CAD0 +extern u8 sub_080045D4(s16, s16, u16, u16); +extern void sub_080AEFE0(Entity *); + +// sub_0803CB64 +extern void PositionRelative(Entity *, Entity *, u32, u32); +extern void sub_08004488(u32); + +typedef struct { + s8 x; + s8 y; +} PACKED OffsetCoords; + +// sub_0803CC08 +extern void DeleteEntity(Entity *); + +// Variables +extern void (*const gUnk_080D0110[])(Entity *); +extern void (*const gUnk_080D0128[])(Entity *); +extern void (*const gUnk_080D0148[])(Entity *); +extern const OffsetCoords gUnk_080D0154[]; + +void Lakitu(Entity *this) { + EnemyFunctionHandler(this, gUnk_080D0110); + + SetChildOffset(this, 0, 1, -16); +} + +void sub_0803C758(Entity *this) { + if (this->action != 0 && this->action != 7) { + sub_0803CAD0(this); + } + + gUnk_080D0128[this->action](this); +} + +void sub_0803C784(Entity *this) { + if ((this->bitfield & 0x7f) == 0x1d) { + this->field_0x20 = 0x20000; + + sub_0803CBAC(this); + } + else { + if (this->damageType == 0x43) { + Entity *sound = CreateFx(this, 2, 0); + + if (sound != 0) { + u32 angle = (this->field_0x3e ^ 0x10) << 3; + s32 sine; + + sine = gSineTable[angle]; + if (sine < 0) { + sine += 0x1f; + } + + sound->x.HALF.HI += sine >> 5; + + sine = gSineTable[angle + 0x40]; + if (sine < 0) { + sine += 0x1f; + } + + sound->y.HALF.HI -= sine >> 5; + } + } + } + + if (this->field_0x43) { + sub_0804A9FC(this, 0x1c); + } + + sub_0804AA30(this, gUnk_080D0110); +} + +void sub_0803C820(Entity *this) { + if (sub_0806F520(this)) { + gUnk_080D0148[this->previousActionFlag](this); + } +} + +void sub_0803C844(Entity *this) { + this->previousActionFlag = 1; + this->field_0x1d = 0x3c; +} + +void sub_0803C850(Entity *this) { + Entity *cloud = this->attachedEntity; + if (cloud != 0) { + cloud->spriteOffsetX = this->spriteOffsetX; + } + + sub_0806F4E8(this); +} + +void sub_0803C86C(Entity *this) { + sub_0803CBAC(this); + this->attachedEntity = 0; +} + +void sub_0803C87C(Entity *this) { + Entity *cloud = sub_0804A98C(this, 17, 0); + if (cloud == 0) { + return; + } + + cloud->parent = this; + this->attachedEntity = cloud; + + sub_0804A720(this); + + this->action = 1; + + this->height.HALF.HI = -2; + + this->spriteOffsetY = 0xff; + + this->field_0x74 = this->x.HALF.HI; + this->field_0x76 = this->y.HALF.HI; +} + +void sub_0803C8BC(Entity *this) { + sub_0803CA84(this, 0); + + if (sub_0803CA4C(this)) { + this->action = 2; + this->spriteSettings.b.ss0 = 1; + } +} + +void sub_0803C8E4(Entity *this) { + UpdateAnimationSingleFrame(this); + + if (this->frames.b.f3) { + this->action = 3; + this->actionDelay = 0x3c; + + this->damageType = 0x42; + + InitAnimationForceUpdate(this, this->animationState + 4); + } +} + +void sub_0803C918(Entity *this) { + if (sub_0803CB04(this) != 0) { + return; + } + + if (sub_0803CA4C(this) == 0) { + this->action = 4; + + this->damageType = 0x43; + InitAnimationForceUpdate(this, this->animationState + 0xc); + } + else { + sub_0803CA84(this, 4); + } +} + +void sub_0803C950(Entity *this) { + UpdateAnimationSingleFrame(this); + + if (this->frames.b.f3 != 0) { + this->action = 1; + this->spriteSettings.b.ss0 = 0; + + InitAnimationForceUpdate(this, this->animationState); + } +} + +void sub_0803C97C(Entity *this) { + UpdateAnimationSingleFrame(this); + + if (this->frames.b.f3 == 0) { + return; + } + + sub_0803CB64(this); + this->action = 6; + this->damageType = 0x42; + + + if ((Random() & 1) && this->field_0x78.HALF.HI == 0) { + this->actionDelay = 0xf; + this->field_0x78.HALF.HI = 1; + } + else { + this->actionDelay = 0x1e; + this->field_0x78.HALF.HI = 0; + + InitAnimationForceUpdate(this->attachedEntity, this->animationState); + } +} + +void sub_0803C9D4(Entity *this) { + this->actionDelay--; + + if (this->actionDelay != 0) { + return; + } + + if (this->field_0x78.HALF.HI == 1) { + sub_0803CB34(this); + } + else { + this->action = 3; + this->actionDelay = 0xb4; + + InitAnimationForceUpdate(this, this->animationState + 4); + } +} + +void sub_0803CA0C(Entity *this) { + if (sub_08003FC4(this, 0x1800) == 0 && this->animIndex <= 19) { + InitAnimationForceUpdate(this, this->animationState + 20); + + this->ticks.b1 = 0; + } + + UpdateAnimationSingleFrame(this); + sub_0803CC08(this); +} + +bool32 sub_0803CA4C(Entity *this) { + if (sub_0806FCB8(this, gLinkEntity.x.HALF.HI, gLinkEntity.y.HALF.HI, 0x28) == 0) { + if (sub_080041A0(this, &gLinkEntity, 0x70, 0x50)) { + return 1; + } + } + + return 0; +} + +void sub_0803CA84(Entity *this, u32 unkParameter) { + u32 altAnimState = sub_080045C4(this, &gLinkEntity); + + if (((altAnimState - 3) & 7) > 2 || ((this->animationState - (altAnimState >> 3)) & 3) > 1) { + u32 intermediate = (altAnimState + 4) & 0x18; + altAnimState = intermediate >> 3; + + if (altAnimState != this->animationState) { + this->animationState = altAnimState; + + InitAnimationForceUpdate(this, altAnimState + unkParameter); + InitAnimationForceUpdate(this->attachedEntity, altAnimState); + } + } +} + +void sub_0803CAD0(Entity *this) { + if (sub_0806FCB8(this, this->field_0x74, this->field_0x76, 1) == 0) { + this->direction = sub_080045D4(this->x.HALF.HI, this->y.HALF.HI, this->field_0x74, this->field_0x76); + + sub_080AEFE0(this); + } +} + +bool32 sub_0803CB04(Entity *this) { + bool32 returnValue; + u8 delay; + + delay = --this->actionDelay; + if (delay != 0) { + returnValue = 0; + } + else { + sub_0803CB34(this); + this->field_0x78.HALF.HI = delay; + + InitAnimationForceUpdate(this->attachedEntity, this->animationState + 4); + returnValue = 1; + } + + return returnValue; +} + +void sub_0803CB34(Entity *this) { + this->action = 5; + this->damageType = 0xa6; + + this->field_0x78.HALF.LO = sub_080045C4(this, &gLinkEntity); + + InitAnimationForceUpdate(this, this->animationState + 8); +} + +void sub_0803CB64(Entity *this) { + Entity *cloud; + const OffsetCoords *offset; + + cloud = sub_0804A98C(this, 18, 0); + + if (cloud == 0) { + return; + } + + offset = &gUnk_080D0154[this->animationState]; + + cloud->direction = this->field_0x78.HALF.LO; + + PositionRelative(this, cloud, offset->x << 16, offset->y << 16); + + sub_08004488(0x193); +} + +void sub_0803CBAC(Entity *this) { + Entity *cloud; + + cloud = this->attachedEntity; + if (cloud != 0) { + cloud->flags |= 0x80; + cloud->damageType = 0x43; + } + + this->action = 7; + this->spriteSettings.b.ss0 = 1; + + this->ticks.b1 = 1; + + this->flags2 &= 0x7b; + + this->damageType = 0x42; + + InitAnimationForceUpdate(this, this->animationState + 16); +} + +void sub_0803CC08(Entity *this) { + Entity *cloud; + Entity *sound; + + cloud = this->attachedEntity; + if (cloud == 0) { + return; + } + + if ((u32)(cloud->height.HALF.HI - this->height.HALF.HI) > 2) { + return; + } + + if (this->field_0x20 >= 0) { + return; + } + + if (!sub_0806FCB8(this, cloud->x.HALF.HI, cloud->y.HALF.HI, 6)) { + return; + } + + sound = CreateFx(this, 2, 0); + if (sound != 0) { + sound->x.HALF.HI += 6; + sound->y.HALF.HI += 6; + } + + sound = CreateFx(this, 2, 0); + if (sound != 0) { + sound->x.HALF.HI -= 6; + sound->y.HALF.HI += 6; + } + + sound = CreateFx(this, 2, 0); + if (sound != 0) { + sound->x.HALF.HI += 6; + sound->y.HALF.HI -= 6; + } + + sound = CreateFx(this, 2, 0); + if (sound != 0) { + sound->x.HALF.HI -= 6; + sound->y.HALF.HI -= 6; + } + + this->attachedEntity = 0; + DeleteEntity(cloud); +} \ No newline at end of file diff --git a/src/lakituCloud.c b/src/lakituCloud.c index 36489ad5..9932b662 100644 --- a/src/lakituCloud.c +++ b/src/lakituCloud.c @@ -82,7 +82,7 @@ void sub_0803CD6C(Entity *this) { this->attachedEntity = lakitu; this->parent = lakitu; - this->field_0x78 = this->x.HALF.HI; + this->field_0x78.HWORD = this->x.HALF.HI; this->field_0x7a = this->y.HALF.HI; InitAnimationForceUpdate(this, 4); @@ -146,7 +146,7 @@ void sub_0803CE3C(Entity *this) { this->field_0x3a &= 0xfb; - this->x.HALF.HI = this->field_0x78; + this->x.HALF.HI = this->field_0x78.HWORD; this->y.HALF.HI = this->field_0x7a; this->attachedEntity = this->parent; diff --git a/src/mask.c b/src/mask.c index 80b952ee..bb867761 100644 --- a/src/mask.c +++ b/src/mask.c @@ -60,7 +60,7 @@ void sub_080929A4(Entity *this) { this->action = 1; this->field_0x20 = 0x18000; - this->field_0x78 = ((Random() & 7) << 10) | 0x2000; + this->field_0x78.HWORD = ((Random() & 7) << 10) | 0x2000; this->field_0xf = this->actionDelay >> 1; this->actionDelay = 0; @@ -129,7 +129,7 @@ void sub_08092B0C(Entity *this) { sub_0805457C(this, 3); } else { - sub_080044EC(this, this->field_0x78); + sub_080044EC(this, this->field_0x78.HWORD); if (this->height.HALF.HI == 0) { this->actionDelay++;