diff --git a/asm/enemyUtils.s b/asm/enemyUtils.s deleted file mode 100644 index 87d302b2..00000000 --- a/asm/enemyUtils.s +++ /dev/null @@ -1,426 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - .text - - thumb_func_start sub_0804A720 -sub_0804A720: @ 0x0804A720 - push {r4, r5, r6, lr} - adds r2, r0, #0 - adds r0, #0x6d - ldrb r1, [r0] - movs r0, #4 - ands r0, r1 - cmp r0, #0 - bne _0804A7D0 - ldrb r0, [r2, #9] - lsls r0, r0, #1 - ldr r1, _0804A76C @ =gUnk_080D3D94 - adds r3, r0, r1 - adds r4, r2, #0 - adds r4, #0x68 - ldrb r1, [r4, #0x16] - cmp r1, #0 - bne _0804A744 - ldrb r1, [r3] -_0804A744: - adds r0, r2, #0 - adds r0, #0x6e - strb r1, [r0] - adds r5, r0, #0 - ldrb r1, [r4, #0x17] - cmp r1, #0 - bne _0804A754 - ldrb r1, [r3, #1] -_0804A754: - adds r0, r2, #0 - adds r0, #0x6f - strb r1, [r0] - adds r6, r0, #0 - ldrh r1, [r4, #0x1c] - adds r3, r1, #0 - cmp r3, #0 - beq _0804A774 - ldr r0, _0804A770 @ =gRoomControls - ldrh r0, [r0, #6] - adds r0, r1, r0 - b _0804A784 - .align 2, 0 -_0804A76C: .4byte gUnk_080D3D94 -_0804A770: .4byte gRoomControls -_0804A774: - ldrb r0, [r5] - lsls r1, r0, #2 - movs r5, #0x2e - ldrsh r0, [r2, r5] - cmp r0, r1 - blt _0804A78C - ldrh r0, [r2, #0x2e] - subs r0, r0, r1 -_0804A784: - adds r1, r2, #0 - adds r1, #0x70 - strh r0, [r1] - b _0804A792 -_0804A78C: - adds r0, r2, #0 - adds r0, #0x70 - strh r3, [r0] -_0804A792: - ldrh r1, [r4, #0x1e] - adds r3, r1, #0 - cmp r3, #0 - beq _0804A7A8 - ldr r0, _0804A7A4 @ =gRoomControls - ldrh r0, [r0, #8] - adds r0, r1, r0 - b _0804A7B8 - .align 2, 0 -_0804A7A4: .4byte gRoomControls -_0804A7A8: - ldrb r0, [r6] - lsls r1, r0, #2 - movs r4, #0x32 - ldrsh r0, [r2, r4] - cmp r0, r1 - blt _0804A7C0 - ldrh r0, [r2, #0x32] - subs r0, r0, r1 -_0804A7B8: - adds r1, r2, #0 - adds r1, #0x72 - strh r0, [r1] - b _0804A7C6 -_0804A7C0: - adds r0, r2, #0 - adds r0, #0x72 - strh r3, [r0] -_0804A7C6: - adds r2, #0x6d - ldrb r1, [r2] - movs r0, #4 - orrs r0, r1 - strb r0, [r2] -_0804A7D0: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0804A7D4 -sub_0804A7D4: @ 0x0804A7D4 - push {lr} - ldrb r1, [r0, #9] - movs r2, #0 - bl CreateDeathFx - pop {pc} - - thumb_func_start CreateDeathFx -CreateDeathFx: @ 0x0804A7E0 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - adds r5, r0, #0 - mov sb, r1 - mov sl, r2 - adds r6, r5, #0 - adds r6, #0x6d - ldrb r1, [r6] - movs r7, #1 - adds r0, r7, #0 - ands r0, r1 - cmp r0, #0 - beq _0804A864 - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _0804A80A - b _0804A982 -_0804A80A: - ldrb r1, [r5, #9] - movs r0, #1 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - bne _0804A81C - b _0804A982 -_0804A81C: - adds r0, #0x6c - strb r7, [r0] - adds r0, r5, #0 - adds r1, r4, #0 - movs r2, #0 - movs r3, #1 - bl PositionRelative - str r5, [r4, #0x50] - ldrb r1, [r6] - movs r0, #2 - orrs r0, r1 - strb r0, [r6] - ldrb r0, [r5, #9] - cmp r0, #0x37 - bne _0804A84A - ldr r0, _0804A85C @ =gRoomTransition - adds r0, #0x39 - ldrb r0, [r0] - cmp r0, #0 - beq _0804A84A - bl DeleteThisEntity -_0804A84A: - bl sub_0807CD9C - ldr r0, _0804A860 @ =0x80100000 - bl SoundReq - bl DeleteThisEntity - b _0804A982 - .align 2, 0 -_0804A85C: .4byte gRoomTransition -_0804A860: .4byte 0x80100000 -_0804A864: - adds r4, r5, #0 - adds r4, #0x3a - ldrb r1, [r4] - movs r0, #2 - ands r0, r1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - mov r8, r0 - cmp r0, #0 - bne _0804A934 - adds r0, r5, #0 - bl sub_08049CF4 - ldr r1, _0804A8E8 @ =gSave - ldr r0, [r1, #0x50] - adds r0, #1 - str r0, [r1, #0x50] - ldrb r0, [r4] - movs r7, #0 - movs r1, #2 - orrs r0, r1 - strb r0, [r4] - movs r0, #0xff - strb r0, [r5, #0xe] - adds r0, r5, #0 - movs r1, #3 - bl SetDefaultPriority - ldrb r1, [r5, #9] - movs r0, #1 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _0804A8CA - adds r0, #0x6c - mov r2, r8 - strb r2, [r0] - adds r0, #1 - mov r1, sb - strb r1, [r0] - adds r0, #1 - mov r2, sl - strb r2, [r0] - str r5, [r4, #0x50] - str r5, [r4, #0x54] - adds r0, r5, #0 - adds r1, r4, #0 - bl CopyPosition -_0804A8CA: - ldrb r1, [r6] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _0804A8EC - adds r0, r4, #0 - adds r0, #0x6c - ldrb r1, [r0] - movs r2, #8 - orrs r1, r2 - strb r1, [r0] - adds r0, r5, #0 - bl DeleteEntity - b _0804A982 - .align 2, 0 -_0804A8E8: .4byte gSave -_0804A8EC: - adds r0, r5, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x13 - bne _0804A934 - ldrb r0, [r5, #0x1c] - movs r1, #0xf - ands r1, r0 - cmp r1, #1 - beq _0804A91A - cmp r1, #2 - bne _0804A92A - cmp r4, #0 - beq _0804A92A - adds r1, r4, #0 - adds r1, #0x6c - ldrb r0, [r1] - movs r2, #2 - orrs r0, r2 - strb r0, [r1] - b _0804A92A -_0804A91A: - cmp r4, #0 - beq _0804A92A - adds r0, r4, #0 - adds r0, #0x6c - ldrb r1, [r0] - movs r2, #4 - orrs r1, r2 - strb r1, [r0] -_0804A92A: - movs r0, #0 - str r0, [r4, #0x50] - bl DeleteThisEntity - b _0804A982 -_0804A934: - ldrb r0, [r5, #0xe] - cmp r0, #0 - bne _0804A940 - bl DeleteThisEntity - b _0804A982 -_0804A940: - subs r1, r0, #1 - strb r1, [r5, #0xe] - lsls r0, r1, #0x18 - cmp r0, #0 - bne _0804A95E - ldrb r1, [r5, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - strb r0, [r5, #0x18] - adds r0, r5, #0 - movs r1, #0 - bl SetDefaultPriority - b _0804A982 -_0804A95E: - lsls r0, r1, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #8 - bhi _0804A982 - ldrb r1, [r5, #0x18] - lsls r0, r1, #0x1e - cmp r0, #0 - beq _0804A976 - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - b _0804A980 -_0804A976: - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 -_0804A980: - strb r0, [r5, #0x18] -_0804A982: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - - thumb_func_start CreateProjectileWithParent -CreateProjectileWithParent: @ 0x0804A98C - push {r4, r5, r6, lr} - adds r6, r0, #0 - adds r0, r1, #0 - adds r5, r2, #0 - bl CreateProjectile - adds r4, r0, #0 - cmp r4, #0 - beq _0804A9A8 - strb r5, [r4, #0xa] - adds r0, r6, #0 - adds r1, r4, #0 - bl CopyPosition -_0804A9A8: - adds r0, r4, #0 - pop {r4, r5, r6, pc} - - thumb_func_start SetChildOffset -SetChildOffset: @ 0x0804A9AC - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - adds r6, r1, #0 - adds r7, r2, #0 - mov ip, r3 - ldr r4, [r5, #0x68] - cmp r4, #0 - beq _0804A9FA - ldrb r2, [r5, #0x19] - lsrs r2, r2, #6 - lsls r2, r2, #6 - ldrb r3, [r4, #0x19] - movs r1, #0x3f - adds r0, r1, #0 - ands r0, r3 - orrs r0, r2 - strb r0, [r4, #0x19] - ldrb r0, [r5, #0x1b] - lsrs r0, r0, #6 - lsls r0, r0, #6 - ldrb r2, [r4, #0x1b] - ands r1, r2 - orrs r1, r0 - strb r1, [r4, #0x1b] - ldrh r0, [r5, #0x2e] - adds r0, r0, r6 - strh r0, [r4, #0x2e] - ldrh r0, [r5, #0x32] - adds r0, r0, r7 - strh r0, [r4, #0x32] - ldrh r0, [r5, #0x36] - add r0, ip - strh r0, [r4, #0x36] - adds r0, r5, #0 - adds r0, #0x38 - ldrb r1, [r0] - adds r0, r4, #0 - adds r0, #0x38 - strb r1, [r0] -_0804A9FA: - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_0804A9FC -sub_0804A9FC: @ 0x0804A9FC - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x68] - cmp r0, #0 - bne _0804AA16 - adds r0, r4, #0 - movs r2, #0 - bl CreateFx - cmp r0, #0 - beq _0804AA16 - str r0, [r4, #0x68] - b _0804AA18 -_0804AA16: - movs r0, #0 -_0804AA18: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_0804AA1C -sub_0804AA1C: @ 0x0804AA1C - push {lr} - adds r2, r0, #0 - ldr r1, [r2, #0x68] - cmp r1, #0 - beq _0804AA2C - movs r0, #0 - str r0, [r1, #0x50] - str r0, [r2, #0x68] -_0804AA2C: - pop {pc} - .align 2, 0 diff --git a/asm/non_matching/enemyUtils/sub_0804A720.inc b/asm/non_matching/enemyUtils/sub_0804A720.inc new file mode 100644 index 00000000..edd90898 --- /dev/null +++ b/asm/non_matching/enemyUtils/sub_0804A720.inc @@ -0,0 +1,101 @@ + .syntax unified + push {r4, r5, r6, lr} + adds r2, r0, #0 + adds r0, #0x6d + ldrb r1, [r0] + movs r0, #4 + ands r0, r1 + cmp r0, #0 + bne _0804A7D0 + ldrb r0, [r2, #9] + lsls r0, r0, #1 + ldr r1, _0804A76C @ =gUnk_080D3D94 + adds r3, r0, r1 + adds r4, r2, #0 + adds r4, #0x68 + ldrb r1, [r4, #0x16] + cmp r1, #0 + bne _0804A744 + ldrb r1, [r3] +_0804A744: + adds r0, r2, #0 + adds r0, #0x6e + strb r1, [r0] + adds r5, r0, #0 + ldrb r1, [r4, #0x17] + cmp r1, #0 + bne _0804A754 + ldrb r1, [r3, #1] +_0804A754: + adds r0, r2, #0 + adds r0, #0x6f + strb r1, [r0] + adds r6, r0, #0 + ldrh r1, [r4, #0x1c] + adds r3, r1, #0 + cmp r3, #0 + beq _0804A774 + ldr r0, _0804A770 @ =gRoomControls + ldrh r0, [r0, #6] + adds r0, r1, r0 + b _0804A784 + .align 2, 0 +_0804A76C: .4byte gUnk_080D3D94 +_0804A770: .4byte gRoomControls +_0804A774: + ldrb r0, [r5] + lsls r1, r0, #2 + movs r5, #0x2e + ldrsh r0, [r2, r5] + cmp r0, r1 + blt _0804A78C + ldrh r0, [r2, #0x2e] + subs r0, r0, r1 +_0804A784: + adds r1, r2, #0 + adds r1, #0x70 + strh r0, [r1] + b _0804A792 +_0804A78C: + adds r0, r2, #0 + adds r0, #0x70 + strh r3, [r0] +_0804A792: + ldrh r1, [r4, #0x1e] + adds r3, r1, #0 + cmp r3, #0 + beq _0804A7A8 + ldr r0, _0804A7A4 @ =gRoomControls + ldrh r0, [r0, #8] + adds r0, r1, r0 + b _0804A7B8 + .align 2, 0 +_0804A7A4: .4byte gRoomControls +_0804A7A8: + ldrb r0, [r6] + lsls r1, r0, #2 + movs r4, #0x32 + ldrsh r0, [r2, r4] + cmp r0, r1 + blt _0804A7C0 + ldrh r0, [r2, #0x32] + subs r0, r0, r1 +_0804A7B8: + adds r1, r2, #0 + adds r1, #0x72 + strh r0, [r1] + b _0804A7C6 +_0804A7C0: + adds r0, r2, #0 + adds r0, #0x72 + strh r3, [r0] +_0804A7C6: + adds r2, #0x6d + ldrb r1, [r2] + movs r0, #4 + orrs r0, r1 + strb r0, [r2] +_0804A7D0: + pop {r4, r5, r6, pc} + .align 2, 0 + .syntax divided diff --git a/asm/non_matching/sub_08054524.inc b/asm/non_matching/sub_08054524.inc index 79c2b1a1..05ac3f4e 100644 --- a/asm/non_matching/sub_08054524.inc +++ b/asm/non_matching/sub_08054524.inc @@ -16,9 +16,9 @@ _0805453A: adds r0, r1, r0 ldrb r1, [r0] lsls r0, r1, #5 - ldr r1, _0805455C @ =gUnk_080015BC + ldr r1, _0805455C @ =gAreaDroptables adds r0, r0, r1 - ldr r1, _08054560 @ =gUnk_02034398 + ldr r1, _08054560 @ =gRoomVars+0x48 movs r2, #0x20 bl MemCopy pop {pc} @@ -26,6 +26,6 @@ _0805453A: _08054550: .4byte gArea _08054554: .4byte gRoomTransition _08054558: .4byte gUnk_080FE1C6 -_0805455C: .4byte gUnk_080015BC -_08054560: .4byte gUnk_02034398 +_0805455C: .4byte gAreaDroptables +_08054560: .4byte gRoomVars+0x48 .syntax divided diff --git a/asm/object/deathFx.s b/asm/object/deathFx.s index ac049903..f23716a0 100644 --- a/asm/object/deathFx.s +++ b/asm/object/deathFx.s @@ -21,7 +21,7 @@ DeathFx: @ 0x0808161C _08081630: .4byte gUnk_0811EBFC thumb_func_start sub_08081634 -sub_08081634: @ 0x08081634 +DeathFx_Action0: @ 0x08081634 push {r4, r5, lr} adds r4, r0, #0 adds r0, #0x6c @@ -136,7 +136,7 @@ _08081718: .4byte gUnk_0811EC08 _0808171C: .4byte gUnk_0811EC20 thumb_func_start sub_08081720 -sub_08081720: @ 0x08081720 +DeathFx_Action1: @ 0x08081720 push {r4, lr} adds r4, r0, #0 bl GetNextFrame @@ -170,7 +170,7 @@ _0808175E: pop {r4, pc} thumb_func_start sub_08081760 -sub_08081760: @ 0x08081760 +DeathFx_Action2: @ 0x08081760 push {r4, lr} adds r4, r0, #0 bl UpdateAnimationSingleFrame @@ -228,7 +228,7 @@ _080817C6: _080817C8: .4byte gUnk_0811EC24 thumb_func_start sub_080817CC -sub_080817CC: @ 0x080817CC +DeathFx_DropRandom9: @ 0x080817CC push {lr} movs r1, #9 bl CreateRandomItemDrop @@ -236,7 +236,7 @@ sub_080817CC: @ 0x080817CC .align 2, 0 thumb_func_start sub_080817D8 -sub_080817D8: @ 0x080817D8 +DeathFx_DropRandom13: @ 0x080817D8 push {lr} movs r1, #0xd bl CreateRandomItemDrop @@ -244,7 +244,7 @@ sub_080817D8: @ 0x080817D8 .align 2, 0 thumb_func_start sub_080817E4 -sub_080817E4: @ 0x080817E4 +DeathFx_DropRandom14: @ 0x080817E4 push {lr} movs r1, #0xe bl CreateRandomItemDrop @@ -252,7 +252,7 @@ sub_080817E4: @ 0x080817E4 .align 2, 0 thumb_func_start sub_080817F0 -sub_080817F0: @ 0x080817F0 +DeathFx_DropRandom1: @ 0x080817F0 push {lr} movs r1, #1 bl CreateRandomItemDrop @@ -260,7 +260,7 @@ sub_080817F0: @ 0x080817F0 .align 2, 0 thumb_func_start sub_080817FC -sub_080817FC: @ 0x080817FC +DeathFx_DropFixedItem: @ 0x080817FC push {lr} adds r1, r0, #0 adds r1, #0x6e @@ -270,7 +270,7 @@ sub_080817FC: @ 0x080817FC pop {pc} thumb_func_start sub_0808180C -sub_0808180C: @ 0x0808180C +DeathFx_Delete: @ 0x0808180C push {lr} bl DeleteThisEntity pop {pc} diff --git a/data/const/object/deathFx.s b/data/const/object/deathFx.s deleted file mode 100644 index 8c911d44..00000000 --- a/data/const/object/deathFx.s +++ /dev/null @@ -1,37 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811EBFC:: @ 0811EBFC - .4byte sub_08081634 - .4byte sub_08081720 - .4byte sub_08081760 - -gUnk_0811EC08:: @ 0811EC08 - .incbin "deathFx/gUnk_0811EC08.bin" - -gUnk_0811EC20:: @ 0811EC20 - .incbin "deathFx/gUnk_0811EC20.bin" - -gUnk_0811EC24:: @ 0811EC24 - .4byte sub_080817CC - .4byte sub_080817D8 - .4byte sub_080817F0 - .4byte sub_080817E4 - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817CC - .4byte sub_080817FC - -gUnk_0811EC64:: @ 0811EC64 - .incbin "deathFx/gUnk_0811EC64.bin" diff --git a/include/droptables.h b/include/droptables.h index 481923e6..f05ae94e 100644 --- a/include/droptables.h +++ b/include/droptables.h @@ -24,11 +24,15 @@ typedef union { } Droptable; static_assert(sizeof(Droptable) == 0x20); -extern const Droptable gUnk_0800137C[]; -extern const Droptable gUnk_0800143C[]; -extern const Droptable gUnk_080015BC[]; -extern const Droptable gUnk_0800161C[]; +extern const Droptable gEnemyDroptables[]; +extern const Droptable gAreaDroptables[]; +extern const Droptable gObjectDroptables[]; extern const Droptable gUnk_0800191C[]; -extern const Droptable gUnk_08001A1C[]; +enum { + DROPTABLE_NONE, + DROPTABLE_NO_SHELLS, + DROPTABLE_NO_KINSTONES, +}; +extern const Droptable gDroptableModifiers[]; #endif // TMC_DROPTABLES_H diff --git a/include/object/deathFx.h b/include/object/deathFx.h new file mode 100644 index 00000000..99cffc86 --- /dev/null +++ b/include/object/deathFx.h @@ -0,0 +1,17 @@ +#ifndef TMC_DEATHFX_H +#define TMC_DEATHFX_H + +#ifndef NENT_DEPRECATED +#error "deathFx.h requires new entities" +#endif +#include "entity.h" + +typedef struct { + Entity base; + int filler68; + u8 unk6c; + u8 parentId; + u8 item; +} DeathFxObject; + +#endif // TMC_DEATHFX_H diff --git a/include/room.h b/include/room.h index 1c0c5f82..56d1fa9b 100644 --- a/include/room.h +++ b/include/room.h @@ -3,6 +3,7 @@ #include "global.h" #include "entity.h" +#include "droptables.h" enum RoomTransition { TRANSITION_DEFAULT, @@ -72,8 +73,8 @@ typedef struct { /* 0x10 */ u8 unk_10[4]; /* 0x14 */ u32 flags; /* 0x18 */ u32 unk3; - /* 0x1c */ u8 filler4[48]; - /* 0x4c */ u8 filler5[28]; + /* 0x1c */ u8 filler4[44]; + /* 0x48 */ Droptable currentAreaDroptable; /* 0x68 */ u32 animFlags; /* 0x6c */ void* field_0x6c[8]; /* 0x8c */ void* field_0x8c[8]; diff --git a/include/save.h b/include/save.h index f63a2976..af4638d5 100644 --- a/include/save.h +++ b/include/save.h @@ -124,6 +124,7 @@ extern const char gUnk_0811E470[]; } */ void UpdateGlobalProgress(void); +void sub_0807CD9C(void); #ifdef DEMO_USA extern const u8* const demoPointers[]; diff --git a/linker.ld b/linker.ld index 5d88c5fe..328ef025 100644 --- a/linker.ld +++ b/linker.ld @@ -116,7 +116,6 @@ SECTIONS { . = 0x000342F8; gUnk_020342F8 = .; . = 0x00034330; gUnk_02034330 = .; . = 0x00034350; gRoomVars = .; - . = 0x00034398; gUnk_02034398 = .; . = 0x00034480; gUnk_02034480 = .; . = 0x00034490; gUnk_02034490 = .; . = 0x00034492; gUnk_02034492 = .; @@ -433,7 +432,6 @@ SECTIONS { src/code_08049CD4.o(.text); /* enemyUtils.c */ asm/code_08049D30.o(.text); src/enemyUtils.o(.text); - asm/enemyUtils.o(.text); src/createEnemy.o(.text); src/enterPortalSubtask.o(.text); asm/enterPortalSubtask.o(.text); @@ -646,7 +644,7 @@ SECTIONS { asm/code_0808091C.o(.text); /* scroll.c */ /* objects */ src/object/itemOnGround.o(.text); - asm/object/deathFx.o(.text); + src/object/deathFx.o(.text); asm/object/itemForSale.o(.text); src/object/button.o(.text); asm/object/minishEmoticon.o(.text); @@ -1358,7 +1356,7 @@ SECTIONS { src/script.o(.rodata); data/data_0811E750.o(.rodata); data/const/object/itemOnGround.o(.rodata); - data/const/object/deathFx.o(.rodata); + src/object/deathFx.o(.rodata); data/animations/object/deathFx.o(.rodata); data/const/object/itemForSale.o(.rodata); data/const/object/button.o(.rodata); diff --git a/src/code_0805436C.c b/src/code_0805436C.c index 112f90ca..be43c45b 100644 --- a/src/code_0805436C.c +++ b/src/code_0805436C.c @@ -20,7 +20,32 @@ extern struct_080FD5B4 gUnk_080FD5B4[]; extern u8 gUnk_0200AF13; extern u8 gUnk_0200AF14; extern u8 gUnk_080FE1C6[]; -extern Droptable gUnk_02034398; +/*{ +0u, +0x1u, +0x2u, +0x3u, +0x4u, +0x5u, +0x6u, +0x7u, +0x8u, +0x9u, +0x8u, +0x9u, +0xau, +0xau, +0xbu, +0xcu, +0xdu, +0xeu, +0xfu, +0x8u, +0xfu, +0x1u, +0x8u, +}; +*/ extern void (*const gUnk_080FE2A0[])(void); void ForceEquipItem(u32, u8); @@ -158,7 +183,7 @@ NONMATCH("asm/non_matching/sub_08054524.inc", void sub_08054524(void)) { bVar1 = 0; } - MemCopy(&gUnk_080015BC[0] + gUnk_080FE1C6[bVar1] * 0x8, &gUnk_02034398, 0x20); + MemCopy(&gAreaDroptables[0] + gUnk_080FE1C6[bVar1] * 0x8, &gRoomVars.currentAreaDroptable, 0x20); } END_NONMATCH @@ -170,8 +195,6 @@ void sub_08054570(void) { gRoomVars.field_0x2 = 0; } -// BUG? -extern const Droptable gUnk_080014e4[]; extern void sub_08000F14(s16*, const s16*, const s16*, const s16*); extern u32 sub_08000F2C(s16*, const s16*, const s16*, const s16*); u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter); @@ -182,17 +205,17 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { ITEM_ENEMY_BEETLE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, ITEM_NONE, }*/; - int r0, r1, r2, r4, r5; + int r0, r1, rand, summOdds, item; u32 r3; const Droptable *ptr2, *ptr3, *ptr4; - Droptable s0; + Droptable droptable; r3 = arg1; if (gRoomVars.field_0x2 != 1) { - ptr2 = &gUnk_08001A1C[0]; - ptr4 = 0; + ptr2 = &gDroptableModifiers[DROPTABLE_NONE]; + ptr4 = NULL; switch (r3) { case 1 ... 12: - ptr4 = &gUnk_0800137C[r3]; + ptr4 = &gEnemyDroptables[r3]; break; #ifndef EU case 24: @@ -208,9 +231,9 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { #ifdef EU case 24: #endif - ptr2 = &gUnk_0800161C[r3]; + ptr2 = &gObjectDroptables[r3 - 16]; case 15: - ptr4 = &gUnk_02034398; + ptr4 = &gRoomVars.currentAreaDroptable; break; case 0: default: @@ -218,59 +241,59 @@ u32 CreateRandomItemDrop(Entity* arg0, u32 arg1) { } if (ptr4 != 0) { if ((r1 = gSave.stats.unkB) == 0) { - ptr3 = &gUnk_08001A1C[0]; + // nop + ptr3 = &gDroptableModifiers[DROPTABLE_NONE]; } else { #ifdef EU - ptr3 = &gUnk_0800143C[r1 + 3]; + ptr3 = &gEnemyDroptables[r1 + 9]; #else - ptr3 = &gUnk_0800143C[r1]; + ptr3 = &gEnemyDroptables[r1 + 6]; #endif } // vector addition, s0 = ptr4 + ptr2 + ptr3 - sub_08000F14(s0.a, ptr4->a, ptr2->a, ptr3->a); + sub_08000F14(droptable.a, ptr4->a, ptr2->a, ptr3->a); if (gSave.stats.health <= 8) { - s0.s.hearts += 5; + droptable.s.hearts += 5; } if (gSave.stats.bombCount == 0) { - s0.s.bombs += 3; + droptable.s.bombs += 3; } if (gSave.stats.arrowCount == 0) { - s0.s.arrows += 3; + droptable.s.arrows += 3; } if (gSave.stats.rupees <= 10) { - s0.s.rupee5 += 1; + droptable.s.rupee5 += 1; } - ptr2 = &gUnk_08001A1C[0]; + ptr2 = &gDroptableModifiers[DROPTABLE_NONE]; r0 = gSave.stats.hasAllFigurines; - ptr3 = ptr2; + ptr3 = &gDroptableModifiers[DROPTABLE_NONE]; // don't drop shells anymore if (r0 != 0) { - ptr2++; + ptr2 = &gDroptableModifiers[DROPTABLE_NO_SHELLS]; } // don't drop kinstones anymore if (gSave.didAllFusions != 0) { - ptr3 += 2; + ptr3 = &gDroptableModifiers[DROPTABLE_NO_KINSTONES]; } // vector addition, s0 = s0 + ptr2 + ptr3 // resulting values are clamped to be >= 0 // returns sum over s0 - r4 = sub_08000F2C(s0.a, s0.a, ptr2->a, ptr3->a); - r2 = Random(); - r5 = (r2 >> 0x18); - r5 &= 0xF; - r2 = r2 % r4; + summOdds = sub_08000F2C(droptable.a, droptable.a, ptr2->a, ptr3->a); + rand = Random(); + item = (rand >> 0x18); + item &= 0xF; + rand = rand % summOdds; { u32 r3; - for (r3 = 0, r1 = 0; r3 < 0x10; r3++, r5 = (r5 + 1) & 0xF) { - if ((r1 += s0.a[r5]) > r2) { + for (r3 = 0, r1 = 0; r3 < 0x10; r3++, item = (item + 1) & 0xF) { + if ((r1 += droptable.a[item]) > rand) { break; } } } - r1 = gUnk_080FE1B4[r5]; - if (r1 != 0) { - r2 = 0; - return CreateItemDrop(arg0, r1, r2); + r1 = gUnk_080FE1B4[item]; + if (r1 != ITEM_NONE) { + return CreateItemDrop(arg0, r1, 0); } } } @@ -311,10 +334,10 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { u32 rand; if (GetInventoryValue(ITEM_KINSTONE_BAG) == 0) { - return 0; + return ITEM_NONE; } if (3 < gRoomVars.filler1[0]) { - return 0; + return ITEM_NONE; } if (itemID != ITEM_KINSTONE) { @@ -362,91 +385,6 @@ u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { } return itemID; } -/* -extern u8 gUnk_080FE1DD[]; - -u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter) { - u32 prereqID; - u32 adjustedParam; - u32 uVar1; - Entity* itemEntity; - - adjustedParam = (u8)itemParameter; - switch (adjustedParam) { - case 0x3f: - if (!GetInventoryValue(0x40)) { - return 0; - } - if (itemParameter == 0) { - adjustedParam = 1; - } - case 0x5d: - if (!GetInventoryValue(0x65)) { - return 0; - } - break; - case 0x5e: - if (!GetInventoryValue(0x9)) { - return 0; - } - break; - case 0x5c: - case 0xfc ... 0xfe: - if (GetInventoryValue(0x67) == 0) { - return 0; - } - if (3 < gRoomVars.filler[5]) { - return 0; - } - - if (itemID != 0x5c) { - adjustedParam = gUnk_080FE1DD[(Random() & 0x3f) + (itemID - 0xfc) * 0x40]; - if (adjustedParam == 0) { - itemID = 0; - } - else { - itemID = 0x5c; - } - } - break; - case 0xff: - if (!GetInventoryValue(0x1)) { - return 0; - } - } - if (itemID != 0) { - if (itemID == 0xff) { - itemEntity = CreateEnemy(BEETLE, 0); - if (itemEntity != NULL) { - itemEntity->x.HALF.HI = arg0->x.HALF.HI; - itemEntity->y.HALF.HI = arg0->y.HALF.HI; - itemEntity->collisionLayer = arg0->collisionLayer; - UpdateSpriteOrderAndFlip(itemEntity); - } - } else { - itemEntity = CreateObject(GROUND_ITEM, itemID, adjustedParam); - if (itemEntity != NULL) { - if (arg0 == &gPlayerEntity) { - itemEntity->actionDelay = 1; - } else { - itemEntity->actionDelay = 0; - } - if (arg0->kind == OBJECT) { - if (arg0->id == 99) { - arg0->child = itemEntity; - } else if (arg0->id == 0x1e) { - itemEntity->direction = arg0->animationState << 3 | 0x80; - itemEntity->speed = 0xc0; - itementity->zVelocity = 0x18000; - } - } - CopyPosition(arg0, itemEntity); - } - } - } - return itemID; -} -*/ void Subtask_WorldEvent(void) { #if !(defined(DEMO_USA) || defined(DEMO_JP)) diff --git a/src/droptables.c b/src/droptables.c index c381618d..d239a80d 100644 --- a/src/droptables.c +++ b/src/droptables.c @@ -1,8 +1,8 @@ #include "global.h" #include "droptables.h" -const Droptable gUnk_0800137C[] = { - { { +const Droptable gEnemyDroptables[] = { + [0] = { { .none = -999, .rupee1 = -999, .rupee5 = -999, @@ -20,7 +20,7 @@ const Droptable gUnk_0800137C[] = { .none4 = 0, .none5 = 0, } }, - { { + [1] = { { .none = 300, .rupee1 = -999, .rupee5 = -999, @@ -38,7 +38,7 @@ const Droptable gUnk_0800137C[] = { .none4 = 0, .none5 = 0, } }, - { { + [2] = { { .none = -999, .rupee1 = -999, .rupee5 = -999, @@ -56,7 +56,7 @@ const Droptable gUnk_0800137C[] = { .none4 = 0, .none5 = 0, } }, - { { + [3] = { { .none = 36, .rupee1 = 28, .rupee5 = 20, @@ -74,7 +74,7 @@ const Droptable gUnk_0800137C[] = { .none4 = 0, .none5 = 0, } }, - { { + [4] = { { .none = 74, .rupee1 = 10, .rupee5 = 5, @@ -92,7 +92,7 @@ const Droptable gUnk_0800137C[] = { .none4 = 0, .none5 = 0, } }, - { { + [5] = { { .none = 100, .rupee1 = 0, .rupee5 = 0, @@ -110,10 +110,7 @@ const Droptable gUnk_0800137C[] = { .none4 = 0, .none5 = 0, } }, -}; -// not 100% sure -const Droptable gUnk_0800143C[] = { - { { + [6] = { { .none = 73, .rupee1 = 25, .rupee5 = -999, @@ -131,7 +128,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [7] = { { .none = 55, .rupee1 = -999, .rupee5 = 70, @@ -149,7 +146,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [8] = { { .none = 50, .rupee1 = -999, .rupee5 = 26, @@ -167,7 +164,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [9] = { { .none = 45, .rupee1 = -999, .rupee5 = -999, @@ -185,7 +182,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [10] = { { .none = 300, .rupee1 = -999, .rupee5 = -999, @@ -203,7 +200,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [11] = { { .none = 60, .rupee1 = 10, .rupee5 = -999, @@ -221,7 +218,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [12] = { { .none = 70, .rupee1 = 0, .rupee5 = -999, @@ -239,7 +236,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [13] = { { .none = 63, .rupee1 = 10, .rupee5 = 20, @@ -257,7 +254,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [14] = { { .none = 50, .rupee1 = 10, .rupee5 = 20, @@ -275,7 +272,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [15] = { { .none = 0, .rupee1 = 0, .rupee5 = 0, @@ -293,7 +290,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [16] = { { .none = 0, .rupee1 = 0, .rupee5 = 0, @@ -311,7 +308,7 @@ const Droptable gUnk_0800143C[] = { .none4 = 0, .none5 = 0, } }, - { { + [17] = { { .none = 0, .rupee1 = 40, .rupee5 = 24, @@ -330,9 +327,9 @@ const Droptable gUnk_0800143C[] = { .none5 = 0, } }, }; -// not 100% sure -const Droptable gUnk_080015BC[] = { - { { + +const Droptable gAreaDroptables[] = { + [0] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -350,7 +347,7 @@ const Droptable gUnk_080015BC[] = { .none4 = 0, .none5 = 0, } }, - { { + [1] = { { .none = 900, .rupee1 = 0, .rupee5 = 0, @@ -368,7 +365,7 @@ const Droptable gUnk_080015BC[] = { .none4 = 0, .none5 = 0, } }, - { { + [2] = { { .none = 920, .rupee1 = 11, .rupee5 = 3, @@ -386,9 +383,7 @@ const Droptable gUnk_080015BC[] = { .none4 = 0, .none5 = 0, } }, -}; -const Droptable gUnk_0800161C[] = { - { { + [3] = { { .none = 920, .rupee1 = 30, .rupee5 = 1, @@ -406,7 +401,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [4] = { { .none = 920, .rupee1 = 6, .rupee5 = 1, @@ -424,7 +419,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [5] = { { .none = 920, .rupee1 = 55, .rupee5 = 7, @@ -442,7 +437,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [6] = { { .none = 920, .rupee1 = 23, .rupee5 = 5, @@ -460,7 +455,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [7] = { { .none = 920, .rupee1 = 20, .rupee5 = 3, @@ -478,7 +473,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [8] = { { .none = 920, .rupee1 = 25, .rupee5 = 6, @@ -496,7 +491,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [9] = { { .none = 920, .rupee1 = 18, .rupee5 = 2, @@ -514,7 +509,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xa] = { { .none = 920, .rupee1 = 30, .rupee5 = 1, @@ -536,7 +531,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xb] = { { .none = 900, .rupee1 = 16, .rupee5 = 4, @@ -554,7 +549,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xc] = { { .none = 920, .rupee1 = 23, .rupee5 = 15, @@ -572,7 +567,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xd] = { { .none = 920, .rupee1 = 25, .rupee5 = 25, @@ -590,7 +585,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xe] = { { .none = 920, .rupee1 = 25, .rupee5 = 1, @@ -608,7 +603,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0xf] = { { .none = 800, .rupee1 = 60, .rupee5 = 15, @@ -626,7 +621,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0x10] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -644,7 +639,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0x11] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -662,7 +657,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [0x12] = { { .none = 920, .rupee1 = 15, .rupee5 = 5, @@ -680,7 +675,9 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { +}; +const Droptable gObjectDroptables[] = { + [0] = { { .none = 0, .rupee1 = 10, .rupee5 = 0, @@ -698,7 +695,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [1] = { { .none = 0, .rupee1 = 3, .rupee5 = 0, @@ -716,7 +713,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [2] = { { .none = 0, .rupee1 = 100, .rupee5 = 20, @@ -734,7 +731,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [3] = { { .none = 0, .rupee1 = 300, .rupee5 = 50, @@ -752,7 +749,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [4] = { { .none = 0, .rupee1 = -999, .rupee5 = -999, @@ -770,7 +767,7 @@ const Droptable gUnk_0800161C[] = { .none4 = 0, .none5 = 0, } }, - { { + [5] = { { .none = 0, .rupee1 = 2, .rupee5 = 2, @@ -1068,7 +1065,7 @@ const Droptable gUnk_0800191C[] = { }; // special treatment for shells and kinstones after finishing figurines/fusions -const Droptable gUnk_08001A1C[] = { +const Droptable gDroptableModifiers[] = { // nop { { .none = 0, diff --git a/src/enemyUtils.c b/src/enemyUtils.c index 0e0929e6..d37c33a1 100644 --- a/src/enemyUtils.c +++ b/src/enemyUtils.c @@ -1,7 +1,13 @@ +#define NENT_DEPRECATED #include "entity.h" #include "definitions.h" #include "functions.h" #include "object.h" +#include "save.h" +#include "projectile.h" +#include "object/deathFx.h" + +extern void sub_08049CF4(Entity*); extern EnemyDefinition gEnemyDefinitions[]; @@ -17,45 +23,45 @@ const EnemyDefinition* GetEnemyDefinition(Entity* entity) { return definition; } -bool32 EnemyInit(Entity* this) { - if ((this->flags & ENT_DID_INIT) == 0) { - const EnemyDefinition* definition = GetEnemyDefinition(this); - if (LoadEnemySprite(this, definition) == FALSE) { +bool32 EnemyInit(GenericEntity* this) { + if ((super->flags & ENT_DID_INIT) == 0) { + const EnemyDefinition* definition = GetEnemyDefinition(super); + if (LoadEnemySprite(super, definition) == FALSE) { return FALSE; } - this->flags |= ENT_DID_INIT; + super->flags |= ENT_DID_INIT; if (definition->spriteFlags.collision != 0) { - COLLISION_ON(this); + COLLISION_ON(super); } - this->spriteIndex = definition->spriteIndex; - if (this->spriteSettings.draw == 0) { - this->spriteSettings.draw = definition->spriteFlags.draw; + super->spriteIndex = definition->spriteIndex; + if (super->spriteSettings.draw == 0) { + super->spriteSettings.draw = definition->spriteFlags.draw; } - this->spritePriority.b1 = definition->spriteFlags.spritePriority; - this->spriteSettings.shadow = definition->spriteFlags.shadow; - if (this->speed == 0) { - this->speed = definition->speed; + super->spritePriority.b1 = definition->spriteFlags.spritePriority; + super->spriteSettings.shadow = definition->spriteFlags.shadow; + if (super->speed == 0) { + super->speed = definition->speed; } - this->flags2 = definition->flags2; - this->hitType = definition->damageType; - this->hitbox = (Hitbox*)definition->ptr.hitbox; - this->health = definition->health; - if (this->hurtType == 0) { - this->hurtType = 0x41; + super->flags2 = definition->flags2; + super->hitType = definition->damageType; + super->hitbox = (Hitbox*)definition->ptr.hitbox; + super->health = definition->health; + if (super->hurtType == 0) { + super->hurtType = 0x41; } - UpdateSpriteForCollisionLayer(this); + UpdateSpriteForCollisionLayer(super); if ((this->field_0x6c.HALF.HI & 0x20) != 0) { - u32 uVar4 = gUnk_080D3E74[this->id >> 3] >> ((this->id & 7) << 1) & 3; + u32 uVar4 = gUnk_080D3E74[super->id >> 3] >> ((super->id & 7) << 1) & 3; if (uVar4 != 0) { Entity* object = CreateObject(OBJECT_A9, uVar4 - 1, 0); if (object != NULL) { - object->actionDelay = this->flags; - object->field_0xf = this->spriteSettings.draw; + object->actionDelay = super->flags; + object->field_0xf = super->spriteSettings.draw; object->spritePriority.b0 = 3; - object->parent = this; - CopyPosition(this, object); - this->flags &= ~ENT_COLLIDE; - this->spriteSettings.draw = 0; + object->parent = super; + CopyPosition(super, object); + super->flags &= ~ENT_COLLIDE; + super->spriteSettings.draw = 0; this->field_0x6c.HALF.HI |= 0x10; } } @@ -86,3 +92,139 @@ bool32 LoadEnemySprite(Entity* entity, const EnemyDefinition* definition) { LoadObjPalette(entity, definition->paletteIndex); return TRUE; } + +ASM_FUNC("asm/non_matching/enemyUtils/sub_0804A720.inc", void sub_0804A720(Entity* this)) + +void CreateDeathFx(GenericEntity* parent, u32 parentId, u32 fixedItem); +void sub_0804A7D4(Entity* this) { + CreateDeathFx((GenericEntity*)this, this->id, 0); +} + +void CreateDeathFx(GenericEntity* parent, u32 parentId, u32 fixedItem) { + DeathFxObject* deathFx; + DeathFxObject* deathFx2; + u8 bVar3; + + if ((parent->field_0x6c.HALF.HI & 1) != 0) { + if ((parent->field_0x6c.HALF.HI & 2) != 0) { + return; + } + deathFx = (DeathFxObject*)CreateObject(DEATH_FX, parent->base.id, 0); + if (deathFx == NULL) { + return; + } + deathFx->unk6c = 1; + PositionRelative(&(parent->base), &(deathFx->base), 0, 1); + deathFx->base.parent = &(parent->base); + parent->field_0x6c.HALF.HI |= 2; + if ((parent->base.id == 0x37) && (gRoomTransition.field_0x39 != 0)) { + DeleteThisEntity(); + } + sub_0807CD9C(); + SoundReq(SONG_STOP_BGM); + DeleteThisEntity(); + return; + } else { + int tmp = parent->base.field_0x3a & 2; + if (tmp == 0) { + sub_08049CF4(&(parent->base)); + gSave.unk50 += 1; + parent->base.field_0x3a |= 2; + parent->base.actionDelay = 0xff; + SetDefaultPriority(&(parent->base), 3); + deathFx2 = (DeathFxObject*)CreateObject(DEATH_FX, parent->base.id, 0); + if (deathFx2 != NULL) { + deathFx2->unk6c = tmp; + deathFx2->parentId = parentId; + deathFx2->item = fixedItem; + deathFx2->base.parent = &(parent->base); + deathFx2->base.child = &(parent->base); + CopyPosition(&(parent->base), &(deathFx2->base)); + } + if ((parent->field_0x6c.HALF.HI & 8) != 0) { + deathFx2->unk6c |= 8; + DeleteEntity(&(parent->base)); + return; + } + if ((parent->base.bitfield & 0x7f) == 0x13) { + bVar3 = parent->base.field_0x1c & 0xf; + if (bVar3 != 1) { + if ((bVar3 == 2) && (deathFx2 != NULL)) { + deathFx2->unk6c |= 2; + } + } else { + if (deathFx2 != NULL) { + deathFx2->unk6c |= 4; + } + } + deathFx2->base.parent = NULL; + DeleteThisEntity(); + return; + } + } + + if (parent->base.actionDelay == 0) { + DeleteThisEntity(); + } else { + if (--parent->base.actionDelay == 0) { + parent->base.spriteSettings.draw = 0; + SetDefaultPriority(&(parent->base), 0); + } else { + if (parent->base.actionDelay < 9) { + if (parent->base.spriteSettings.draw) { + parent->base.spriteSettings.draw = 0; + } else { + parent->base.spriteSettings.draw = 1; + } + } + } + } + return; + } +} + +Entity* CreateProjectileWithParent(Entity* parent, u32 projectileId, u32 projectileType) { + Entity* projectile; + + projectile = CreateProjectile(projectileId); + if (projectile != NULL) { + projectile->type = projectileType; + CopyPosition(parent, projectile); + } + return projectile; +} + +void SetChildOffset(Entity* entity, s32 xOffset, s32 yOffset, s32 zOffset) { + Entity* other; + GenericEntity* this = (GenericEntity*)entity; + + other = *(Entity**)&this->field_0x68; + if (other != NULL) { + other->spriteRendering.b3 = super->spriteRendering.b3; + other->spriteOrientation.flipY = super->spriteOrientation.flipY; + other->x.HALF.HI = super->x.HALF.HI + xOffset; + other->y.HALF.HI = super->y.HALF.HI + yOffset; + other->z.HALF.HI = super->z.HALF.HI + zOffset; + other->collisionLayer = super->collisionLayer; + } +} + +Entity* sub_0804A9FC(Entity* parent, u32 fxType) { + Entity* fx; + GenericEntity* this = (GenericEntity*)parent; + + if ((*(Entity**)&this->field_0x68 == NULL) && (fx = CreateFx(super, fxType, 0), fx != NULL)) { + *(Entity**)&this->field_0x68 = fx; + } else { + fx = NULL; + } + return fx; +} + +void sub_0804AA1C(Entity* entity) { + GenericEntity* this = (GenericEntity*)entity; + if (*(Entity**)&this->field_0x68 != NULL) { + (*(Entity**)&this->field_0x68)->parent = NULL; + *(Entity**)&this->field_0x68 = NULL; + } +} diff --git a/src/object/deathFx.c b/src/object/deathFx.c new file mode 100644 index 00000000..4fe5ccb9 --- /dev/null +++ b/src/object/deathFx.c @@ -0,0 +1,260 @@ +#include "global.h" +#define NENT_DEPRECATED +#include "entity.h" +#include "sound.h" +#include "functions.h" +#include "object/deathFx.h" +#include "enemy.h" + +void sub_08081790(DeathFxObject* this); +void DeathFx_Delete(DeathFxObject* this); + +void DeathFx_Action0(DeathFxObject* this); +void DeathFx_Action1(DeathFxObject* this); +void DeathFx_Action2(DeathFxObject* this); +void DeathFx(Entity* this) { + static void (*const DeathFx_Actions[])(DeathFxObject*) = { + DeathFx_Action0, + DeathFx_Action1, + DeathFx_Action2, + }; + DeathFx_Actions[this->action]((DeathFxObject*)this); +} + +void DeathFx_Action0(DeathFxObject* this) { + static const u8 gUnk_0811EC08[] = { + 0, 64, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + static const u8 gUnk_0811EC20[] = { + 26, + 14, + 26, + 26, + }; + Entity* parent; + int uVar4; + u32 tmp; + + if (this->unk6c & 1) { + super->spriteIndex = 0x65; + super->action = 2; + super->direction = 0; + super->speed = 0x40; + super->collisionLayer = 2; + UpdateSpriteForCollisionLayer(&this->base); + super->spriteRendering.b0 = 3; + if (super->actionDelay == 0) { + tmp = 0x80; + } else { + tmp = super->actionDelay; + super->actionDelay = 0; + } + sub_0805EC9C(super, tmp, tmp, 0); + LoadSwapGFX(super, 4, 0); + InitAnimationForceUpdate(super, 0); + SoundReq(SFX_BOSS_EXPLODE); + } else { + if (this->unk6c & 0xc) { + sub_08081790(this); + DeathFx_Delete(this); + } else { + if (this->unk6c & 2) { + InitializeAnimation(&this->base, 2); + } else { + super->spritePriority.b0 = 3; + uVar4 = gUnk_0811EC08[super->type >> 2]; + uVar4 >>= ((super->type % 4) << 1); + uVar4 &= 3; + parent = super->parent; + if (parent != NULL) { + parent->actionDelay = gUnk_0811EC20[uVar4]; + } + InitializeAnimation(&this->base, uVar4); + } + } + super->action = 1; + EnqueueSFX(SFX_FF); + } + SetDefaultPriority(super, 3); +} + +void DeathFx_Action1(DeathFxObject* this) { + GetNextFrame(super); + if (super->frame & 0x80) { + sub_08081790(this); + DeathFx_Delete(this); + } else { + if ((super->frame & 1) != 0) { + super->spritePriority.b0 = 4; + } + } +} + +void DeathFx_Action2(DeathFxObject* this) { + UpdateAnimationSingleFrame(super); + if (super->frame & 0x80) { + DeathFx_Delete(this); + } else { + if ((super->frame & 1) != 0) { + LinearMoveUpdate(super); + } + } +} + +void DeathFx_DropRandom9(DeathFxObject* this); +void DeathFx_DropRandom13(DeathFxObject* this); +void DeathFx_DropRandom1(DeathFxObject* this); +void DeathFx_DropRandom14(DeathFxObject* this); +void DeathFx_DropFixedItem(DeathFxObject* this); +void sub_08081790(DeathFxObject* this) { + static void (*const DeathFx_DropFunctions[])(DeathFxObject*) = { + DeathFx_DropRandom9, DeathFx_DropRandom13, DeathFx_DropRandom1, DeathFx_DropRandom14, + DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, + DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, + DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropRandom9, DeathFx_DropFixedItem, + }; + static const u8 DeathFx_EnemyDroptables[] = { + [OCTOROK] = 6, + [CHUCHU] = 6, + [LEEVER] = 6, + [PEAHAT] = 6, + [ROLLOBITE] = 0, + [DARK_NUT] = 11, + [HANGING_SEED] = 0, + [BEETLE] = 6, + [KEESE] = 6, + [DOOR_MIMIC] = 0, + [ROCK_CHUCHU] = 10, + [SPINY_CHUCHU] = 6, + [CUCCO_CHICK_AGGR] = 6, + [MOLDORM] = 7, + [ENEMY_E] = 6, + [MOLDWORM] = 6, + [SLUGGULA] = 6, + [PESTO] = 0, + [PUFFSTOOL] = 6, + [CHUCHU_BOSS] = 6, + [LIKE_LIKE] = 6, + [SPEAR_MOBLIN] = 8, + [BUSINESS_SCRUB] = 0, + [RUPEE_LIKE] = 8, + [MADDERPILLAR] = 6, + [WATER_DROP] = 6, + [WALL_MASTER] = 8, + [BOMB_PEAHAT] = 10, + [SPARK] = 6, + [CHASER] = 0, + [SPIKED_BEETLE] = 6, + [SENSOR_BLADE_TRAP] = 0, + [HELMASAUR] = 6, + [FALLING_BOULDER] = 0, + [BOBOMB] = 10, + [WALL_MASTER_2] = 8, + [GLEEROK] = 6, + [VAATI_EYES_MACRO] = 0, + [TEKTITE] = 6, + [WIZZROBE_WIND] = 6, + [WIZZROBE_FIRE] = 6, + [WIZZROBE_ICE] = 6, + [ARMOS] = 11, + [EYEGORE] = 9, + [ROPE] = 6, + [SMALL_PESTO] = 1, + [ACRO_BANDIT] = 6, + [BLADE_TRAP] = 0, + [KEATON] = 7, + [CROW] = 6, + [MULLDOZER] = 6, + [BOMBAROSSA] = 6, + [WISP] = 0, + [SPINY_BEETLE] = 6, + [MAZAAL_HEAD] = 6, + [MAZAAL_MACRO] = 6, + [MAZAAL_HAND] = 6, + [OCTOROK_BOSS] = 6, + [FLYING_POT] = 6, + [GOBDO] = 6, + [OCTOROK_GOLDEN] = 6, + [TEKTITE_GOLDEN] = 6, + [ROPE_GOLDEN] = 6, + [CLOUD_PIRANHA] = 6, + [SCISSORS_BEETLE] = 7, + [CUCCO_AGGR] = 6, + [STALFOS] = 7, + [FLYING_SKULL] = 6, + [MAZAAL_BRACELET] = 6, + [TAKKURI] = 6, + [BOW_MOBLIN] = 8, + [LAKITU] = 6, + [LAKITU_CLOUD] = 6, + [TORCH_TRAP] = 6, + [VAATI_REBORN_ENEMY] = 6, + [VAATI_PROJECTILE] = 6, + [BALL_CHAIN_SOLIDER] = 8, + [ENEMY_4D] = 8, + [GHINI] = 6, + [VAATI_TRANSFIGURED] = 6, + [ENEMY_50] = 6, + [VAATI_WRATH] = 6, + [VAATI_ARM] = 12, + [DUST] = 0, + [VAATI_BALL] = 6, + [OCTOROK2] = 6, + [SLIME] = 6, + [MINI_SLIME] = 6, + [FIREBALL_GUY] = 6, + [MINI_FIREBALL_GUY] = 6, + [VAATI_TRANSFIGURED_EYE] = 6, + [BUSINESS_SCRUB_PROLOGUE] = 0, + [GYORG_FEMALE] = 6, + [GYORG_MALE] = 6, + [CURTAIN] = 0, + [VAATI_WRATH_EYE] = 6, + [GYORG_CHILD] = 12, + [GYORG_FEMALE_EYE] = 6, + [GYORG_MALE_EYE] = 6, + [GYORG_FEMALE_MOUTH] = 6, + [ENEMY_64] = 6, + [TREE_ITEM] = 6, + [ENEMY_66] = 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + }; + if (this->parentId < 0xf0) { + CreateRandomItemDrop(super, DeathFx_EnemyDroptables[this->parentId]); + } else { + DeathFx_DropFunctions[this->parentId - 0xf0](this); + } +} + +void DeathFx_DropRandom9(DeathFxObject* this) { + CreateRandomItemDrop(super, 9); +} + +void DeathFx_DropRandom13(DeathFxObject* this) { + CreateRandomItemDrop(super, 13); +} + +void DeathFx_DropRandom14(DeathFxObject* this) { + CreateRandomItemDrop(super, 14); +} + +void DeathFx_DropRandom1(DeathFxObject* this) { + CreateRandomItemDrop(super, 1); +} + +u32 CreateItemDrop(Entity* arg0, u32 itemID, u32 itemParameter); +void DeathFx_DropFixedItem(DeathFxObject* this) { + CreateItemDrop(super, this->item, 0); +} + +void DeathFx_Delete(DeathFxObject* this) { + DeleteThisEntity(); +} diff --git a/src/room.c b/src/room.c index cbc94ff1..b12dbea4 100644 --- a/src/room.c +++ b/src/room.c @@ -39,11 +39,6 @@ static void LoadDestructibleTile(TileEntity*); static void LoadGrassDropTile(TileEntity*); static void LoadLocationTile(TileEntity*); -typedef struct { - u8 filler[0x20]; -} VarStruct; -extern VarStruct gUnk_080015BC[]; - void LoadRoomEntityList(EntityData* listPtr) { if (listPtr != NULL) { while (listPtr->kind != 0xFF) { @@ -302,7 +297,7 @@ void LoadRoomTileEntities(TileEntity* list) { } static void LoadGrassDropTile(TileEntity* tile) { - MemCopy(&gUnk_080015BC[tile->_1], &gRoomVars.filler4[44], 0x20); + MemCopy(&gAreaDroptables[tile->_1], &gRoomVars.currentAreaDroptable, 0x20); } static void LoadLocationTile(TileEntity* tile) {