summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-17 16:03:04 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-18 20:49:00 +0100
commit4a1d2fb406d32a76765f0eff396bebb70ff397cd (patch)
treeeef8412057b1d2207a490f9d421be6ec32520edd
parent8d86343827cb79b5ceca4f775cf9aec9732dad30 (diff)
Decompile ObjectOnSpinyBeetle
-rw-r--r--asm/object/objectOnSpinyBeetle.s651
-rw-r--r--assets/assets.json5
-rw-r--r--data/const/object/objectOnSpinyBeetle.s33
-rw-r--r--include/object.h2
-rw-r--r--linker.ld4
-rw-r--r--src/object/objectOnSpinyBeetle.c305
6 files changed, 308 insertions, 692 deletions
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
@@ -44946,11 +44946,6 @@
"size": 8
},
{
- "path": "objectOnSpinyBeetle/gUnk_08123558.bin",
- "start": 1193304,
- "size": 16
- },
- {
"path": "animations/gSpriteAnimations_PicoBloom_0.bin",
"start": 1193338,
"size": 25,
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;
+}