From 4a1d2fb406d32a76765f0eff396bebb70ff397cd Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Thu, 17 Feb 2022 16:03:04 +0100 Subject: [PATCH] Decompile ObjectOnSpinyBeetle --- asm/object/objectOnSpinyBeetle.s | 651 ------------------------ assets/assets.json | 5 - data/const/object/objectOnSpinyBeetle.s | 33 -- include/object.h | 2 +- linker.ld | 4 +- src/object/objectOnSpinyBeetle.c | 305 +++++++++++ 6 files changed, 308 insertions(+), 692 deletions(-) delete mode 100644 asm/object/objectOnSpinyBeetle.s delete mode 100644 data/const/object/objectOnSpinyBeetle.s create mode 100644 src/object/objectOnSpinyBeetle.c diff --git a/asm/object/objectOnSpinyBeetle.s b/asm/object/objectOnSpinyBeetle.s deleted file mode 100644 index f93fa2a3..00000000 --- a/asm/object/objectOnSpinyBeetle.s +++ /dev/null @@ -1,651 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectOnSpinyBeetle -ObjectOnSpinyBeetle: @ 0x08098544 - push {lr} - ldr r2, _08098558 @ =gUnk_0812350C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08098558: .4byte gUnk_0812350C - - thumb_func_start sub_0809855C -sub_0809855C: @ 0x0809855C - push {r4, r5, lr} - adds r4, r0, #0 - movs r3, #0 - movs r5, #1 - strb r5, [r4, #0xc] - ldrb r0, [r4, #0x10] - movs r2, #0x80 - orrs r0, r2 - strb r0, [r4, #0x10] - movs r0, #0x29 - adds r0, r0, r4 - mov ip, r0 - ldrb r1, [r0] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - mov r1, ip - strb r0, [r1] - ldrb r1, [r4, #0x19] - movs r0, #0x3f - ands r0, r1 - orrs r0, r2 - strb r0, [r4, #0x19] - strb r3, [r4, #0xf] - adds r1, r4, #0 - adds r1, #0x3f - movs r0, #0x6e - strb r0, [r1] - subs r1, #4 - movs r0, #0x86 - strb r0, [r1] - strb r3, [r4, #0x16] - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _080985AC - movs r0, #2 - strb r0, [r4, #0x1c] - b _080985AE -_080985AC: - strb r5, [r4, #0x1c] -_080985AE: - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl SortEntityBelow - adds r0, r4, #0 - bl sub_08098918 - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_080985C0 -sub_080985C0: @ 0x080985C0 - push {r4, lr} - adds r4, r0, #0 - bl sub_080989E4 - cmp r0, #0 - bne _080985CE - b _080986FC -_080985CE: - ldrb r0, [r0, #0xc] - cmp r0, #4 - bls _080985D6 - b _080986E6 -_080985D6: - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _080985E6 - b _080986EE -_080985E6: - movs r0, #0x3f - ands r0, r1 - subs r0, #4 - cmp r0, #0x1c - bls _080985F2 - b _08098702 -_080985F2: - lsls r0, r0, #2 - ldr r1, _080985FC @ =_08098600 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_080985FC: .4byte _08098600 -_08098600: @ jump table - .4byte _080986C4 @ case 0 - .4byte _080986C4 @ case 1 - .4byte _080986C4 @ case 2 - .4byte _08098702 @ case 3 - .4byte _080986C4 @ case 4 - .4byte _080986C4 @ case 5 - .4byte _080986C4 @ case 6 - .4byte _080986C4 @ case 7 - .4byte _080986C4 @ case 8 - .4byte _080986C4 @ case 9 - .4byte _08098702 @ case 10 - .4byte _0809867E @ case 11 - .4byte _080986C4 @ case 12 - .4byte _080986C4 @ case 13 - .4byte _080986C4 @ case 14 - .4byte _08098674 @ case 15 - .4byte _080986E0 @ case 16 - .4byte _08098702 @ case 17 - .4byte _080986E0 @ case 18 - .4byte _08098702 @ case 19 - .4byte _080986C4 @ case 20 - .4byte _080986C4 @ case 21 - .4byte _080986C4 @ case 22 - .4byte _08098702 @ case 23 - .4byte _08098702 @ case 24 - .4byte _0809867E @ case 25 - .4byte _08098702 @ case 26 - .4byte _08098702 @ case 27 - .4byte _080986E0 @ case 28 -_08098674: - movs r1, #0 - movs r0, #3 - strb r0, [r4, #0xc] - strb r1, [r4, #0xd] - b _08098702 -_0809867E: - movs r2, #0 - movs r0, #4 - strb r0, [r4, #0xc] - movs r0, #0xa8 - lsls r0, r0, #0xa - str r0, [r4, #0x20] - adds r0, r4, #0 - adds r0, #0x63 - strb r2, [r0] - ldrb r1, [r4, #0x18] - movs r0, #0x31 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x10 - orrs r0, r1 - strb r0, [r4, #0x18] - adds r3, r4, #0 - adds r3, #0x29 - ldrb r1, [r3] - movs r0, #0x39 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #0x18 - orrs r0, r1 - strb r0, [r3] - ldrb r1, [r4, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r4, #0x10] - ldr r0, [r4, #0x50] - str r2, [r0, #0x54] - adds r0, r4, #0 - bl sub_080988E8 - b _08098702 -_080986C4: - ldrb r0, [r4, #0xa] - cmp r0, #0 - beq _080986E6 - ldr r0, _080986DC @ =gPlayerState - adds r0, #0xac - ldrh r1, [r0] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _08098702 - b _080986E6 - .align 2, 0 -_080986DC: .4byte gPlayerState -_080986E0: - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08098702 -_080986E6: - adds r0, r4, #0 - bl sub_080989C0 - b _08098702 -_080986EE: - adds r0, r4, #0 - bl sub_08098918 - adds r0, r4, #0 - bl sub_08078930 - b _08098702 -_080986FC: - adds r0, r4, #0 - bl sub_080989C0 -_08098702: - pop {r4, pc} - - thumb_func_start sub_08098704 -sub_08098704: @ 0x08098704 - push {lr} - ldr r2, _08098718 @ =gUnk_08123524 - ldrb r1, [r0, #0xd] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08098718: .4byte gUnk_08123524 - - thumb_func_start sub_0809871C -sub_0809871C: @ 0x0809871C - adds r3, r0, #0 - ldrb r1, [r3, #0x10] - movs r0, #0x80 - movs r2, #0 - orrs r0, r1 - strb r0, [r3, #0x10] - adds r1, r3, #0 - adds r1, #0x3c - movs r0, #7 - strb r0, [r1] - adds r1, #3 - movs r0, #1 - strb r0, [r1] - ldr r0, _08098754 @ =gPlayerEntity - adds r0, #0x3b - ldrb r0, [r0] - subs r1, #4 - strb r0, [r1] - adds r0, r3, #0 - adds r0, #0x63 - strb r2, [r0] - ldr r0, [r3, #0x50] - str r2, [r0, #0x54] - ldrb r0, [r3, #0xd] - adds r0, #1 - strb r0, [r3, #0xd] - bx lr - .align 2, 0 -_08098754: .4byte gPlayerEntity - - thumb_func_start nullsub_533 -nullsub_533: @ 0x08098758 - bx lr - .align 2, 0 - - thumb_func_start sub_0809875C -sub_0809875C: @ 0x0809875C - adds r0, #0x29 - ldrb r2, [r0] - movs r1, #0x39 - rsbs r1, r1, #0 - ands r1, r2 - movs r2, #0x18 - orrs r1, r2 - strb r1, [r0] - bx lr - .align 2, 0 - - thumb_func_start sub_08098770 -sub_08098770: @ 0x08098770 - push {r4, lr} - adds r4, r0, #0 - bl sub_080043E8 - cmp r0, #2 - beq _0809878C - cmp r0, #2 - bhi _08098786 - cmp r0, #1 - beq _08098792 - b _080987A4 -_08098786: - cmp r0, #3 - beq _08098798 - b _080987A4 -_0809878C: - adds r0, r4, #0 - movs r1, #0xb - b _0809879C -_08098792: - adds r0, r4, #0 - movs r1, #0 - b _0809879C -_08098798: - adds r0, r4, #0 - movs r1, #0xc -_0809879C: - movs r2, #0 - bl CreateFx - b _080987AC -_080987A4: - adds r0, r4, #0 - bl sub_080989C0 - b _080987B0 -_080987AC: - bl DeleteThisEntity -_080987B0: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080987B4 -sub_080987B4: @ 0x080987B4 - push {lr} - bl DeleteThisEntity - pop {pc} - - thumb_func_start sub_080987BC -sub_080987BC: @ 0x080987BC - push {lr} - adds r1, r0, #0 - ldr r0, _080987D0 @ =gPlayerState - ldrb r0, [r0, #5] - cmp r0, #0 - bne _080987CE - adds r0, r1, #0 - bl sub_080987D4 -_080987CE: - pop {pc} - .align 2, 0 -_080987D0: .4byte gPlayerState - - thumb_func_start sub_080987D4 -sub_080987D4: @ 0x080987D4 - movs r2, #0 - movs r1, #1 - strb r1, [r0, #0xc] - strb r2, [r0, #0xd] - bx lr - .align 2, 0 - - thumb_func_start sub_080987E0 -sub_080987E0: @ 0x080987E0 - push {r4, lr} - adds r4, r0, #0 - ldr r1, _0809880C @ =gUnk_08123540 - ldrb r0, [r4, #0xd] - lsls r0, r0, #2 - adds r0, r0, r1 - ldr r1, [r0] - adds r0, r4, #0 - bl _call_via_r1 - ldrb r0, [r4, #0xd] - cmp r0, #1 - bhi _0809880A - adds r0, r4, #0 - bl sub_080989E4 - cmp r0, #0 - bne _0809880A - adds r0, r4, #0 - bl sub_080989C0 -_0809880A: - pop {r4, pc} - .align 2, 0 -_0809880C: .4byte gUnk_08123540 - - thumb_func_start sub_08098810 -sub_08098810: @ 0x08098810 - movs r2, #0 - movs r1, #1 - strb r1, [r0, #0xd] - movs r1, #0x30 - strb r1, [r0, #0x1d] - strb r2, [r0, #0xe] - bx lr - .align 2, 0 - - thumb_func_start sub_08098820 -sub_08098820: @ 0x08098820 - push {lr} - adds r2, r0, #0 - ldr r0, _0809884C @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _0809883E - adds r0, r2, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x13 - beq _08098850 -_0809883E: - adds r1, r2, #0 - adds r1, #0x62 - movs r0, #0 - strb r0, [r1] - movs r0, #1 - strb r0, [r2, #0xc] - b _08098856 - .align 2, 0 -_0809884C: .4byte gPlayerState -_08098850: - adds r0, r2, #0 - bl sub_0806F4E8 -_08098856: - pop {pc} - - thumb_func_start sub_08098858 -sub_08098858: @ 0x08098858 - push {r4, lr} - adds r4, r0, #0 - ldrb r1, [r4, #0xe] - cmp r1, #0 - bne _08098878 - movs r0, #1 - strb r0, [r4, #0xe] - adds r0, r4, #0 - adds r0, #0x62 - strb r1, [r0] - adds r2, r4, #0 - adds r2, #0x63 - movs r0, #0xfe - strb r0, [r2] - ldr r0, [r4, #0x50] - str r1, [r0, #0x54] -_08098878: - ldr r0, _0809889C @ =gPlayerState - ldrb r1, [r0, #0x1c] - movs r0, #0xf - ands r0, r1 - cmp r0, #1 - bne _08098892 - adds r0, r4, #0 - adds r0, #0x41 - ldrb r1, [r0] - movs r0, #0x7f - ands r0, r1 - cmp r0, #0x13 - beq _080988A0 -_08098892: - adds r0, r4, #0 - bl sub_080989C0 - b _080988B4 - .align 2, 0 -_0809889C: .4byte gPlayerState -_080988A0: - adds r0, r4, #0 - bl sub_0806F3E4 - cmp r0, #0 - beq _080988B4 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080988B4 - bl DeleteThisEntity -_080988B4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080988B8 -sub_080988B8: @ 0x080988B8 - push {lr} - adds r2, r0, #0 - ldr r0, _080988CC @ =gPlayerState - ldrb r0, [r0, #0x1c] - cmp r0, #0 - bne _080988D0 - adds r0, r2, #0 - bl sub_080989C0 - b _080988D8 - .align 2, 0 -_080988CC: .4byte gPlayerState -_080988D0: - ldrb r1, [r2, #0x10] - movs r0, #0x7f - ands r0, r1 - strb r0, [r2, #0x10] -_080988D8: - pop {pc} - .align 2, 0 - - thumb_func_start nullsub_123 -nullsub_123: @ 0x080988DC - bx lr - .align 2, 0 - - thumb_func_start sub_080988E0 -sub_080988E0: @ 0x080988E0 - push {lr} - bl sub_080989C0 - pop {pc} - - thumb_func_start sub_080988E8 -sub_080988E8: @ 0x080988E8 - push {r4, lr} - adds r4, r0, #0 - ldr r0, [r4, #0x20] - cmp r0, #0 - bge _080988FA - ldrb r0, [r4, #0x18] - movs r1, #0x80 - orrs r0, r1 - strb r0, [r4, #0x18] -_080988FA: - movs r1, #0x80 - lsls r1, r1, #6 - adds r0, r4, #0 - bl GravityUpdate - cmp r0, #0 - bne _0809890E - adds r0, r4, #0 - bl sub_080989C0 -_0809890E: - pop {r4, pc} - - thumb_func_start sub_08098910 -sub_08098910: @ 0x08098910 - push {lr} - bl sub_080989C0 - pop {pc} - - thumb_func_start sub_08098918 -sub_08098918: @ 0x08098918 - push {r4, r5, r6, lr} - adds r4, r0, #0 - bl sub_080989E4 - adds r6, r0, #0 - cmp r6, #0 - bne _0809892E - adds r0, r4, #0 - bl sub_080989C0 - b _080989BC -_0809892E: - adds r0, r6, #0 - adds r1, r4, #0 - bl CopyPosition - ldrb r1, [r6, #0x10] - movs r0, #0x80 - ands r0, r1 - lsls r0, r0, #0x18 - lsrs r5, r0, #0x18 - cmp r5, #0 - beq _08098990 - ldrb r0, [r4, #0xf] - cmp r0, #0 - bne _08098968 - adds r0, #1 - strb r0, [r4, #0xf] - adds r2, r4, #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] - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl SortEntityBelow -_08098968: - ldr r2, _0809898C @ =gUnk_08123558 - adds r0, r6, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0xf - ands r0, r1 - adds r0, r0, r2 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - subs r0, #8 - movs r1, #0 - strh r0, [r4, #0x36] - adds r0, r4, #0 - adds r0, #0x63 - strb r1, [r0] - b _080989BC - .align 2, 0 -_0809898C: .4byte gUnk_08123558 -_08098990: - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _080989B2 - strb r5, [r4, #0xf] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] - ldr r1, [r4, #0x50] - adds r0, r4, #0 - bl SortEntityBelow -_080989B2: - strh r5, [r4, #0x36] - adds r1, r4, #0 - adds r1, #0x63 - movs r0, #3 - strb r0, [r1] -_080989BC: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_080989C0 -sub_080989C0: @ 0x080989C0 - push {r4, lr} - adds r4, r0, #0 - bl sub_080989E4 - cmp r0, #0 - beq _080989D2 - ldr r1, [r4, #0x50] - movs r0, #0 - str r0, [r1, #0x54] -_080989D2: - ldrb r1, [r4, #0xa] - adds r1, #3 - adds r0, r4, #0 - movs r2, #0 - bl CreateFx - bl DeleteThisEntity - pop {r4, pc} - - thumb_func_start sub_080989E4 -sub_080989E4: @ 0x080989E4 - push {lr} - ldr r1, [r0, #0x50] - cmp r1, #0 - beq _080989F4 - ldr r0, [r1, #4] - cmp r0, #0 - bne _080989F4 - movs r1, #0 -_080989F4: - adds r0, r1, #0 - pop {pc} diff --git a/assets/assets.json b/assets/assets.json index 73a4cd28..5425bdd7 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -44945,11 +44945,6 @@ "start": 1193212, "size": 8 }, - { - "path": "objectOnSpinyBeetle/gUnk_08123558.bin", - "start": 1193304, - "size": 16 - }, { "path": "animations/gSpriteAnimations_PicoBloom_0.bin", "start": 1193338, diff --git a/data/const/object/objectOnSpinyBeetle.s b/data/const/object/objectOnSpinyBeetle.s deleted file mode 100644 index f457ca8b..00000000 --- a/data/const/object/objectOnSpinyBeetle.s +++ /dev/null @@ -1,33 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0812350C:: @ 0812350C - .4byte sub_0809855C - .4byte sub_080985C0 - .4byte sub_08098704 - .4byte sub_080987E0 - .4byte sub_080988E8 - .4byte sub_08098910 - -gUnk_08123524:: @ 08123524 - .4byte sub_0809871C - .4byte nullsub_533 - .4byte sub_0809875C - .4byte sub_08098770 - .4byte sub_080987B4 - .4byte sub_080987BC - .4byte sub_080987D4 - -gUnk_08123540:: @ 08123540 - .4byte sub_08098810 - .4byte sub_08098820 - .4byte sub_08098858 - .4byte sub_080988B8 - .4byte nullsub_123 - .4byte sub_080988E0 - -gUnk_08123558:: @ 08123558 - .incbin "objectOnSpinyBeetle/gUnk_08123558.bin" diff --git a/include/object.h b/include/object.h index 655a1bf6..4a4d11f4 100644 --- a/include/object.h +++ b/include/object.h @@ -351,7 +351,7 @@ void Object79(Entity*); void Steam(Entity*); void PushableLever(); void MacroShoes(Entity*); -void ObjectOnSpinyBeetle(Entity*); +void ObjectOnSpinyBeetle(); void Object7E(Entity*); void PicoBloom(Entity*); void Board(Entity*); diff --git a/linker.ld b/linker.ld index d881f027..3569ac23 100644 --- a/linker.ld +++ b/linker.ld @@ -770,7 +770,7 @@ SECTIONS { src/object/steam.o(.text); src/object/pushableLever.o(.text); asm/object/macroShoes.o(.text); - asm/object/objectOnSpinyBeetle.o(.text); + src/object/objectOnSpinyBeetle.o(.text); src/object/object7E.o(.text); asm/object/picoBloom.o(.text); asm/object/board.o(.text); @@ -1519,7 +1519,7 @@ SECTIONS { src/object/pushableLever.o(.rodata); data/animations/object/pushableLever.o(.rodata); data/const/object/macroShoes.o(.rodata); - data/const/object/objectOnSpinyBeetle.o(.rodata); + src/object/objectOnSpinyBeetle.o(.rodata); data/const/object/picoBloom.o(.rodata); data/animations/object/picoBloom.o(.rodata); data/const/object/board.o(.rodata); diff --git a/src/object/objectOnSpinyBeetle.c b/src/object/objectOnSpinyBeetle.c new file mode 100644 index 00000000..56336a0d --- /dev/null +++ b/src/object/objectOnSpinyBeetle.c @@ -0,0 +1,305 @@ +/** + * @file objectOnSpinyBeetle.c + * @ingroup Objects + * + * @brief Object on Spiny Beetle object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; +} ObjectOnSpinyBeetleEntity; + +extern void (*const ObjectOnSpinyBeetle_Actions[])(ObjectOnSpinyBeetleEntity*); +extern void (*const ObjectOnSpinyBeetle_Action2Subactions[])(ObjectOnSpinyBeetleEntity*); +extern void (*const ObjectOnSpinyBeetle_Action3Subactions[])(ObjectOnSpinyBeetleEntity*); +extern const s8 gUnk_08123558[]; + +void sub_08098918(ObjectOnSpinyBeetleEntity*); +Entity* ObjectOnSpinyBeetle_GetParent(ObjectOnSpinyBeetleEntity*); +void sub_080989C0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Init(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action5(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction5(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action2Subaction6(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction0(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction1(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction2(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction3(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction4(ObjectOnSpinyBeetleEntity*); +void ObjectOnSpinyBeetle_Action3Subaction5(ObjectOnSpinyBeetleEntity*); + +void ObjectOnSpinyBeetle(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Actions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Init, ObjectOnSpinyBeetle_Action1, ObjectOnSpinyBeetle_Action2, + ObjectOnSpinyBeetle_Action3, ObjectOnSpinyBeetle_Action4, ObjectOnSpinyBeetle_Action5, + }; + ObjectOnSpinyBeetle_Actions[super->action](this); +} + +void ObjectOnSpinyBeetle_Init(ObjectOnSpinyBeetleEntity* this) { + super->action = 1; + super->flags |= ENT_COLLIDE; + super->spritePriority.b0 = 6; + super->spriteRendering.b3 = 2; + super->field_0xf = 0; + super->hitType = 0x6e; + super->flags2 = 0x86; + super->field_0x16 = 0; + if (super->type != 0) { + super->field_0x1c = 2; + } else { + super->field_0x1c = 1; + } + SortEntityBelow(super, super->parent); + sub_08098918(this); +} + +void ObjectOnSpinyBeetle_Action1(ObjectOnSpinyBeetleEntity* this) { + Entity* parent = ObjectOnSpinyBeetle_GetParent(this); + if (parent != NULL) { + if (4 < parent->action) { + sub_080989C0(this); + return; + } + if ((super->bitfield & 0x80) != 0) { + switch (super->bitfield & 0x3f) { + case 0x13: + super->action = 3; + super->subAction = 0; + break; + case 0xf: + case 0x1d: + super->action = 4; + super->zVelocity = 0x2a000; + super->spriteOffsetY = 0; + super->spriteSettings.shadow = 1; + super->spritePriority.b1 = 3; + super->flags &= ~ENT_COLLIDE; + (super->parent)->child = NULL; + ObjectOnSpinyBeetle_Action4(this); + break; + case 4: + case 5: + case 6: + case 8: + case 9: + case 10: + case 0xb: + case 0xc: + case 0xd: + case 0x10: + case 0x11: + case 0x12: + case 0x18: + case 0x19: + case 0x1a: + if (super->type == 0 || (gPlayerState.field_0xac & 8) != 0) { + sub_080989C0(this); + } + break; + case 0x14: + case 0x16: + case 0x20: + if (super->type == 0) { + sub_080989C0(this); + } + } + } else { + sub_08098918(this); + sub_08078930(super); + } + } else { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action2(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Action2Subactions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Action2Subaction0, ObjectOnSpinyBeetle_Action2Subaction1, + ObjectOnSpinyBeetle_Action2Subaction2, ObjectOnSpinyBeetle_Action2Subaction3, + ObjectOnSpinyBeetle_Action2Subaction4, ObjectOnSpinyBeetle_Action2Subaction5, + ObjectOnSpinyBeetle_Action2Subaction6, + }; + ObjectOnSpinyBeetle_Action2Subactions[super->subAction](this); +} + +void ObjectOnSpinyBeetle_Action2Subaction0(ObjectOnSpinyBeetleEntity* this) { + super->flags |= ENT_COLLIDE; + super->field_0x3c = 7; + super->hitType = 1; + super->flags2 = gPlayerEntity.flags2; + super->spriteOffsetY = 0; + (super->parent)->child = NULL; + super->subAction += 1; +} + +void ObjectOnSpinyBeetle_Action2Subaction1(ObjectOnSpinyBeetleEntity* this) { +} + +void ObjectOnSpinyBeetle_Action2Subaction2(ObjectOnSpinyBeetleEntity* this) { + super->spritePriority.b1 = 3; +} + +void ObjectOnSpinyBeetle_Action2Subaction3(ObjectOnSpinyBeetleEntity* this) { + switch (sub_080043E8(super)) { + case 2: + CreateFx(super, FX_WATER_SPLASH, 0); + break; + case 1: + CreateFx(super, FX_FALL_DOWN, 0); + break; + case 3: + CreateFx(super, FX_LAVA_SPLASH, 0); + break; + default: + sub_080989C0(this); + return; + } + DeleteThisEntity(); +} + +void ObjectOnSpinyBeetle_Action2Subaction4(ObjectOnSpinyBeetleEntity* this) { + DeleteThisEntity(); +} + +void ObjectOnSpinyBeetle_Action2Subaction5(ObjectOnSpinyBeetleEntity* this) { + if (gPlayerState.heldObject == 0) { + ObjectOnSpinyBeetle_Action2Subaction6(this); + } +} + +void ObjectOnSpinyBeetle_Action2Subaction6(ObjectOnSpinyBeetleEntity* this) { + super->action = 1; + super->subAction = 0; +} + +void ObjectOnSpinyBeetle_Action3(ObjectOnSpinyBeetleEntity* this) { + static void (*const ObjectOnSpinyBeetle_Action3Subactions[])(ObjectOnSpinyBeetleEntity*) = { + ObjectOnSpinyBeetle_Action3Subaction0, ObjectOnSpinyBeetle_Action3Subaction1, + ObjectOnSpinyBeetle_Action3Subaction2, ObjectOnSpinyBeetle_Action3Subaction3, + ObjectOnSpinyBeetle_Action3Subaction4, ObjectOnSpinyBeetle_Action3Subaction5, + }; + + ObjectOnSpinyBeetle_Action3Subactions[super->subAction](this); + if ((super->subAction < 2) && (ObjectOnSpinyBeetle_GetParent(this) == NULL)) { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action3Subaction0(ObjectOnSpinyBeetleEntity* this) { + super->subAction = 1; + super->field_0x1d = 0x30; + super->actionDelay = 0; +} + +void ObjectOnSpinyBeetle_Action3Subaction1(ObjectOnSpinyBeetleEntity* this) { + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + super->spriteOffsetX = 0; + super->action = 1; + } else { + sub_0806F4E8(super); + } +} + +void ObjectOnSpinyBeetle_Action3Subaction2(ObjectOnSpinyBeetleEntity* this) { + if (super->actionDelay == 0) { + super->actionDelay = 1; + super->spriteOffsetX = 0; + super->spriteOffsetY = -2; + (super->parent)->child = NULL; + } + if ((gPlayerState.field_0x1c & 0xf) != 1 || (super->bitfield & 0x7f) != 0x13) { + sub_080989C0(this); + } else { + if ((sub_0806F3E4(super) != 0) && (super->type == 0)) { + DeleteThisEntity(); + } + } +} + +void ObjectOnSpinyBeetle_Action3Subaction3(ObjectOnSpinyBeetleEntity* this) { + if (gPlayerState.field_0x1c == 0) { + sub_080989C0(this); + } else { + (this->base).flags &= ~ENT_COLLIDE; + } +} + +void ObjectOnSpinyBeetle_Action3Subaction4(ObjectOnSpinyBeetleEntity* this) { +} + +void ObjectOnSpinyBeetle_Action3Subaction5(ObjectOnSpinyBeetleEntity* this) { + sub_080989C0(this); +} + +void ObjectOnSpinyBeetle_Action4(ObjectOnSpinyBeetleEntity* this) { + if (super->zVelocity < 0) { + super->spriteSettings.flipY = 1; + } + if (GravityUpdate(super, 0x2000) == 0) { + sub_080989C0(this); + } +} + +void ObjectOnSpinyBeetle_Action5(ObjectOnSpinyBeetleEntity* this) { + sub_080989C0(this); +} + +void sub_08098918(ObjectOnSpinyBeetleEntity* this) { + static const s8 gUnk_08123558[] = { 1, 2, 2, 2, 0, -3, -3, -4, -3, -4, -3, -3, -3, 0, 0, 0 }; + u16 tmp; + Entity* parent = ObjectOnSpinyBeetle_GetParent(this); + if (parent == NULL) { + sub_080989C0(this); + } else { + CopyPosition(parent, super); + tmp = parent->flags & 0x80; + if ((parent->flags & ENT_COLLIDE) != 0) { + if (super->field_0xf == 0) { + super->field_0xf += 1; + super->spritePriority.b0 = 3; + SortEntityBelow(super, super->parent); + } + super->z.HALF.HI = gUnk_08123558[parent->frame & 0xf] - 8; + super->spriteOffsetY = 0; + } else { + if (super->field_0xf != 0) { + super->field_0xf = tmp; + super->spritePriority.b0 = 6; + SortEntityBelow(super, super->parent); + } + super->z.HALF.HI = tmp; + super->spriteOffsetY = 3; + } + } +} + +void sub_080989C0(ObjectOnSpinyBeetleEntity* this) { + if (ObjectOnSpinyBeetle_GetParent(this) != NULL) { + (super->parent)->child = NULL; + } + CreateFx(super, super->type + FX_BUSH, 0); + DeleteThisEntity(); +} + +Entity* ObjectOnSpinyBeetle_GetParent(ObjectOnSpinyBeetleEntity* this) { + Entity* parent = super->parent; + if ((parent != NULL) && (parent->next == NULL)) { + parent = NULL; + } + return parent; +}