summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoroctorock <79596758+octorock@users.noreply.github.com>2022-02-13 22:40:25 +0100
committeroctorock <79596758+octorock@users.noreply.github.com>2022-02-18 20:49:00 +0100
commit8d86343827cb79b5ceca4f775cf9aec9732dad30 (patch)
treed111e0eb79c377926720e3dc05245b5bf3f2a0af
parent0aebbae239abcfcd2dce4423a6caa1a706a04f41 (diff)
Decompile Fairy
-rw-r--r--asm/object/fairy.s642
-rw-r--r--assets/assets.json5
-rw-r--r--data/const/object/fairy.s20
-rw-r--r--include/object.h2
-rw-r--r--linker.ld4
-rw-r--r--src/object/fairy.c259
-rw-r--r--src/object/itemOnGround.c1
7 files changed, 262 insertions, 671 deletions
diff --git a/asm/object/fairy.s b/asm/object/fairy.s
deleted file mode 100644
index 9ef7cce9..00000000
--- a/asm/object/fairy.s
+++ /dev/null
@@ -1,642 +0,0 @@
- .include "asm/macros.inc"
-
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-
- thumb_func_start Fairy
-Fairy: @ 0x0808D674
- push {r4, lr}
- adds r4, r0, #0
- adds r0, #0x41
- ldrb r1, [r0]
- movs r0, #0x80
- ands r0, r1
- cmp r0, #0
- beq _0808D750
- movs r0, #0x7f
- ands r0, r1
- cmp r0, #0x1f
- bhi _0808D750
- lsls r0, r0, #2
- ldr r1, _0808D698 @ =_0808D69C
- adds r0, r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0808D698: .4byte _0808D69C
-_0808D69C: @ jump table
- .4byte _0808D740 @ case 0
- .4byte _0808D740 @ case 1
- .4byte _0808D750 @ case 2
- .4byte _0808D750 @ case 3
- .4byte _0808D740 @ case 4
- .4byte _0808D740 @ case 5
- .4byte _0808D740 @ case 6
- .4byte _0808D750 @ case 7
- .4byte _0808D740 @ case 8
- .4byte _0808D740 @ case 9
- .4byte _0808D740 @ case 10
- .4byte _0808D740 @ case 11
- .4byte _0808D740 @ case 12
- .4byte _0808D750 @ case 13
- .4byte _0808D750 @ case 14
- .4byte _0808D750 @ case 15
- .4byte _0808D750 @ case 16
- .4byte _0808D750 @ case 17
- .4byte _0808D750 @ case 18
- .4byte _0808D748 @ case 19
- .4byte _0808D71C @ case 20
- .4byte _0808D750 @ case 21
- .4byte _0808D750 @ case 22
- .4byte _0808D750 @ case 23
- .4byte _0808D750 @ case 24
- .4byte _0808D750 @ case 25
- .4byte _0808D750 @ case 26
- .4byte _0808D750 @ case 27
- .4byte _0808D750 @ case 28
- .4byte _0808D750 @ case 29
- .4byte _0808D740 @ case 30
- .4byte _0808D73C @ case 31
-_0808D71C:
- movs r0, #3
- strb r0, [r4, #0xc]
- ldrb r1, [r4, #0x10]
- movs r0, #0x7f
- ands r0, r1
- strb r0, [r4, #0x10]
- ldrb r1, [r4, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #1
- orrs r0, r1
- strb r0, [r4, #0x18]
- ldr r0, [r4, #0x4c]
- str r0, [r4, #0x54]
- b _0808D750
-_0808D73C:
- bl DeleteThisEntity
-_0808D740:
- adds r0, r4, #0
- bl sub_0808DAD0
- b _0808D750
-_0808D748:
- adds r0, r4, #0
- bl sub_0808D76C
- b _0808D766
-_0808D750:
- ldr r0, _0808D768 @ =gUnk_08121784
- ldrb r1, [r4, #0xc]
- lsls r1, r1, #2
- adds r1, r1, r0
- ldr r1, [r1]
- adds r0, r4, #0
- bl _call_via_r1
- adds r0, r4, #0
- bl sub_08080CB4
-_0808D766:
- pop {r4, pc}
- .align 2, 0
-_0808D768: .4byte gUnk_08121784
-
- thumb_func_start sub_0808D76C
-sub_0808D76C: @ 0x0808D76C
- push {lr}
- ldr r2, _0808D780 @ =gUnk_08121798
- ldrb r1, [r0, #0xd]
- lsls r1, r1, #2
- adds r1, r1, r2
- ldr r1, [r1]
- bl _call_via_r1
- pop {pc}
- .align 2, 0
-_0808D780: .4byte gUnk_08121798
-
- thumb_func_start sub_0808D784
-sub_0808D784: @ 0x0808D784
- movs r3, #1
- movs r1, #1
- strb r1, [r0, #0xd]
- strb r1, [r0, #0x1d]
- ldrb r2, [r0, #0x18]
- subs r1, #5
- ands r1, r2
- orrs r1, r3
- strb r1, [r0, #0x18]
- bx lr
-
- thumb_func_start sub_0808D798
-sub_0808D798: @ 0x0808D798
- push {lr}
- bl sub_0806F4E8
- pop {pc}
-
- thumb_func_start sub_0808D7A0
-sub_0808D7A0: @ 0x0808D7A0
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0806F3E4
- cmp r0, #0
- beq _0808D7B2
- adds r0, r4, #0
- bl sub_0808DB2C
-_0808D7B2:
- pop {r4, pc}
-
- thumb_func_start sub_0808D7B4
-sub_0808D7B4: @ 0x0808D7B4
- push {r4, lr}
- adds r4, r0, #0
- adds r1, r4, #0
- adds r1, #0x38
- movs r0, #3
- strb r0, [r1]
- adds r0, r4, #0
- adds r0, #0x3c
- movs r2, #0x17
- strb r2, [r0]
- adds r1, #8
- movs r0, #0x49
- strb r0, [r1]
- subs r1, #1
- movs r0, #7
- strb r0, [r1]
- adds r0, r4, #0
- adds r0, #0x3b
- strb r2, [r0]
- adds r1, #6
- movs r0, #0xff
- strb r0, [r1]
- ldr r0, _0808D818 @ =gUnk_080FD1A8
- str r0, [r4, #0x48]
- movs r0, #1
- strb r0, [r4, #0x1c]
- ldrh r1, [r4, #0x2e]
- adds r0, r4, #0
- adds r0, #0x74
- strh r1, [r0]
- ldrh r0, [r4, #0x32]
- adds r1, r4, #0
- adds r1, #0x76
- strh r0, [r1]
- adds r0, r4, #0
- movs r1, #6
- bl SetDefaultPriority
- movs r0, #0x9b
- lsls r0, r0, #1
- bl EnqueueSFX
- ldrb r0, [r4, #0xb]
- cmp r0, #2
- beq _0808D834
- cmp r0, #2
- bgt _0808D81C
- cmp r0, #0
- beq _0808D822
- b _0808D82E
- .align 2, 0
-_0808D818: .4byte gUnk_080FD1A8
-_0808D81C:
- cmp r0, #3
- beq _0808D83C
- b _0808D82E
-_0808D822:
- movs r0, #0xf0
- lsls r0, r0, #9
- str r0, [r4, #0x20]
- ldrh r0, [r4, #0x36]
- adds r0, #8
- strh r0, [r4, #0x36]
-_0808D82E:
- movs r0, #1
- strb r0, [r4, #0xc]
- b _0808D842
-_0808D834:
- adds r0, r4, #0
- bl sub_0808DAD0
- b _0808D842
-_0808D83C:
- adds r0, r4, #0
- bl sub_0808DB2C
-_0808D842:
- pop {r4, pc}
-
- thumb_func_start sub_0808D844
-sub_0808D844: @ 0x0808D844
- push {lr}
- adds r3, r0, #0
- ldr r0, [r3, #0x34]
- ldr r1, _0808D870 @ =0xFFFF2000
- adds r0, r0, r1
- str r0, [r3, #0x34]
- adds r0, r3, #0
- adds r0, #0x5a
- ldrb r0, [r0]
- cmp r0, #0
- beq _0808D88A
- ldrb r0, [r3, #0xe]
- cmp r0, #0
- beq _0808D874
- adds r2, r3, #0
- adds r2, #0x78
- ldrh r1, [r2]
- lsls r0, r1, #4
- subs r0, r0, r1
- lsls r0, r0, #1
- strh r0, [r2]
- b _0808D87E
- .align 2, 0
-_0808D870: .4byte 0xFFFF2000
-_0808D874:
- adds r1, r3, #0
- adds r1, #0x78
- movs r0, #0x96
- lsls r0, r0, #2
- strh r0, [r1]
-_0808D87E:
- movs r0, #2
- strb r0, [r3, #0xc]
- movs r0, #1
- strb r0, [r3, #0xf]
- movs r0, #0x80
- strh r0, [r3, #0x24]
-_0808D88A:
- pop {pc}
-
- thumb_func_start sub_0808D88C
-sub_0808D88C: @ 0x0808D88C
- push {r4, r5, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xf]
- subs r0, #1
- strb r0, [r4, #0xf]
- lsls r0, r0, #0x18
- cmp r0, #0
- bne _0808D910
- bl Random
- adds r5, r0, #0
- ldrb r0, [r4, #0x10]
- movs r1, #0x80
- orrs r0, r1
- strb r0, [r4, #0x10]
- movs r0, #0x20
- strb r0, [r4, #0xf]
- ldr r2, _0808D8D0 @ =gUnk_081217A4
- lsrs r0, r5, #8
- movs r1, #1
- ands r0, r1
- adds r0, r0, r2
- ldrb r0, [r0]
- strh r0, [r4, #0x24]
- adds r0, r4, #0
- bl sub_0808DAA0
- cmp r0, #0
- beq _0808D8D4
- movs r0, #0x1f
- ands r5, r0
- strb r5, [r4, #0x15]
- b _0808D8EE
- .align 2, 0
-_0808D8D0: .4byte gUnk_081217A4
-_0808D8D4:
- movs r1, #0x2e
- ldrsh r0, [r4, r1]
- movs r2, #0x32
- ldrsh r1, [r4, r2]
- adds r2, r4, #0
- adds r2, #0x74
- ldrh r2, [r2]
- adds r3, r4, #0
- adds r3, #0x76
- ldrh r3, [r3]
- bl CalculateDirectionTo
- strb r0, [r4, #0x15]
-_0808D8EE:
- ldrb r1, [r4, #0x15]
- movs r0, #0xf
- ands r0, r1
- cmp r0, #0
- beq _0808D910
- movs r0, #0x10
- eors r1, r0
- lsrs r1, r1, #4
- movs r0, #1
- ands r1, r0
- lsls r1, r1, #6
- ldrb r2, [r4, #0x18]
- movs r0, #0x41
- rsbs r0, r0, #0
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, #0x18]
-_0808D910:
- adds r0, r4, #0
- bl ProcessMovement1
- bl AnyPrioritySet
- cmp r0, #0
- bne _0808D954
- ldrb r0, [r4, #0xb]
- cmp r0, #0
- bne _0808D954
- adds r5, r4, #0
- adds r5, #0x78
- ldrh r0, [r5]
- subs r0, #1
- strh r0, [r5]
- lsls r0, r0, #0x10
- cmp r0, #0
- bne _0808D93C
- adds r0, r4, #0
- movs r1, #0
- bl sub_08081404
-_0808D93C:
- ldrh r0, [r5]
- cmp r0, #0x77
- bhi _0808D954
- ldrb r2, [r4, #0x18]
- lsls r1, r2, #0x1e
- lsrs r1, r1, #0x1e
- movs r0, #1
- eors r1, r0
- subs r0, #5
- ands r0, r2
- orrs r0, r1
- strb r0, [r4, #0x18]
-_0808D954:
- pop {r4, r5, pc}
- .align 2, 0
-
- thumb_func_start sub_0808D958
-sub_0808D958: @ 0x0808D958
- push {r4, lr}
- adds r4, r0, #0
- ldr r2, [r4, #0x54]
- ldrh r1, [r2, #8]
- movs r0, #0xc2
- lsls r0, r0, #2
- cmp r1, r0
- beq _0808D972
- adds r0, r4, #0
- movs r1, #0
- bl sub_08081404
- b _0808D992
-_0808D972:
- adds r0, r2, #0
- adds r1, r4, #0
- bl CopyPosition
- ldrh r0, [r4, #0x36]
- subs r0, #1
- strh r0, [r4, #0x36]
- ldr r1, _0808D994 @ =gPlayerEntity
- adds r0, r4, #0
- bl IsColliding
- cmp r0, #0
- beq _0808D992
- adds r0, r4, #0
- bl sub_0808DB2C
-_0808D992:
- pop {r4, pc}
- .align 2, 0
-_0808D994: .4byte gPlayerEntity
-
- thumb_func_start sub_0808D998
-sub_0808D998: @ 0x0808D998
- push {r4, r5, r6, lr}
- adds r5, r0, #0
- ldr r6, [r5, #0x54]
- ldr r2, _0808DA28 @ =gSineTable
- ldrb r0, [r5, #0xe]
- lsls r0, r0, #1
- adds r0, r0, r2
- movs r3, #0
- ldrsh r1, [r0, r3]
- lsls r0, r1, #2
- adds r0, r0, r1
- lsls r0, r0, #9
- cmp r0, #0
- bge _0808D9B8
- ldr r1, _0808DA2C @ =0x0000FFFF
- adds r0, r0, r1
-_0808D9B8:
- asrs r0, r0, #0x10
- ldrh r3, [r6, #0x2e]
- adds r0, r0, r3
- strh r0, [r5, #0x2e]
- ldrb r0, [r5, #0xe]
- adds r0, #0x40
- lsls r0, r0, #1
- adds r0, r0, r2
- movs r2, #0
- ldrsh r1, [r0, r2]
- lsls r0, r1, #2
- adds r0, r0, r1
- lsls r0, r0, #8
- cmp r0, #0
- bge _0808D9DA
- ldr r3, _0808DA2C @ =0x0000FFFF
- adds r0, r0, r3
-_0808D9DA:
- asrs r1, r0, #0x10
- ldrh r0, [r6, #0x32]
- subs r0, r0, r1
- strh r0, [r5, #0x32]
- ldrb r3, [r5, #0xe]
- adds r0, r3, #0
- adds r0, #8
- strb r0, [r5, #0xe]
- ldrh r0, [r6, #0x36]
- strh r0, [r5, #0x36]
- ldrb r2, [r6, #0x1b]
- lsrs r2, r2, #6
- lsls r2, r2, #6
- ldrb r4, [r5, #0x1b]
- movs r1, #0x3f
- adds r0, r1, #0
- ands r0, r4
- orrs r0, r2
- strb r0, [r5, #0x1b]
- ldrb r0, [r6, #0x19]
- lsrs r0, r0, #6
- lsls r0, r0, #6
- ldrb r2, [r5, #0x19]
- ands r1, r2
- orrs r1, r0
- strb r1, [r5, #0x19]
- subs r3, #0x39
- lsls r3, r3, #0x18
- lsrs r3, r3, #0x18
- cmp r3, #0x7e
- bhi _0808DA30
- adds r2, r5, #0
- adds r2, #0x29
- ldrb r0, [r2]
- movs r1, #8
- rsbs r1, r1, #0
- ands r1, r0
- movs r0, #3
- b _0808DA3E
- .align 2, 0
-_0808DA28: .4byte gSineTable
-_0808DA2C: .4byte 0x0000FFFF
-_0808DA30:
- adds r2, r5, #0
- adds r2, #0x29
- ldrb r0, [r2]
- movs r1, #8
- rsbs r1, r1, #0
- ands r1, r0
- movs r0, #5
-_0808DA3E:
- orrs r1, r0
- strb r1, [r2]
- ldrb r0, [r5, #0xf]
- subs r0, #1
- strb r0, [r5, #0xf]
- lsls r0, r0, #0x18
- adds r4, r5, #0
- adds r4, #0x63
- cmp r0, #0
- bne _0808DA70
- movs r0, #6
- strb r0, [r5, #0xf]
- ldrb r0, [r4]
- subs r0, #1
- strb r0, [r4]
- lsls r0, r0, #0x18
- asrs r0, r0, #0x18
- movs r1, #0x16
- rsbs r1, r1, #0
- cmp r0, r1
- bge _0808DA70
- adds r0, r5, #0
- movs r1, #1
- bl sub_08081404
-_0808DA70:
- movs r1, #0
- ldrsb r1, [r4, r1]
- movs r0, #0x11
- rsbs r0, r0, #0
- cmp r1, r0
- bge _0808DA8E
- ldrb r2, [r5, #0x18]
- lsls r1, r2, #0x1e
- lsrs r1, r1, #0x1e
- movs r0, #1
- eors r1, r0
- subs r0, #5
- ands r0, r2
- orrs r0, r1
- strb r0, [r5, #0x18]
-_0808DA8E:
- adds r1, r5, #0
- adds r1, #0x87
- ldrb r0, [r1]
- cmp r0, #0xa
- bls _0808DA9C
- movs r0, #0xa
- strb r0, [r1]
-_0808DA9C:
- pop {r4, r5, r6, pc}
- .align 2, 0
-
- thumb_func_start sub_0808DAA0
-sub_0808DAA0: @ 0x0808DAA0
- push {lr}
- adds r2, r0, #0
- movs r1, #0x2e
- ldrsh r0, [r2, r1]
- adds r1, r2, #0
- adds r1, #0x74
- ldrh r1, [r1]
- subs r0, r0, r1
- adds r0, #0x30
- cmp r0, #0x60
- bhi _0808DACC
- movs r1, #0x32
- ldrsh r0, [r2, r1]
- adds r1, r2, #0
- adds r1, #0x76
- ldrh r1, [r1]
- subs r0, r0, r1
- adds r0, #0x30
- cmp r0, #0x60
- bhi _0808DACC
- movs r0, #1
- b _0808DACE
-_0808DACC:
- movs r0, #0
-_0808DACE:
- pop {pc}
-
- thumb_func_start sub_0808DAD0
-sub_0808DAD0: @ 0x0808DAD0
- push {r4, lr}
- adds r4, r0, #0
- adds r0, #0x45
- ldrb r0, [r0]
- cmp r0, #0
- bne _0808DAE0
- bl DeleteThisEntity
-_0808DAE0:
- movs r0, #4
- strb r0, [r4, #0xc]
- movs r0, #0x80
- strb r0, [r4, #0xe]
- movs r0, #6
- strb r0, [r4, #0xf]
- ldrb r1, [r4, #0x10]
- movs r0, #0x7f
- ands r0, r1
- strb r0, [r4, #0x10]
- ldrb r1, [r4, #0x18]
- movs r0, #4
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #1
- orrs r0, r1
- strb r0, [r4, #0x18]
- adds r2, r4, #0
- adds r2, #0x29
- ldrb r1, [r2]
- movs r0, #0x39
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #0x10
- orrs r0, r1
- strb r0, [r2]
- adds r1, r4, #0
- adds r1, #0x63
- movs r0, #0xfb
- strb r0, [r1]
- ldr r0, _0808DB28 @ =gPlayerEntity
- str r0, [r4, #0x54]
- adds r1, r4, #0
- bl CopyPosition
- pop {r4, pc}
- .align 2, 0
-_0808DB28: .4byte gPlayerEntity
-
- thumb_func_start sub_0808DB2C
-sub_0808DB2C: @ 0x0808DB2C
- push {lr}
- adds r1, r0, #0
- movs r2, #0
- movs r0, #2
- strb r0, [r1, #0xc]
- strb r2, [r1, #0xd]
- ldrb r2, [r1, #0x10]
- movs r0, #0x80
- orrs r0, r2
- strb r0, [r1, #0x10]
- adds r2, r1, #0
- adds r2, #0x3b
- movs r0, #1
- strb r0, [r2]
- ldr r0, _0808DB50 @ =gPlayerEntity
- bl CopyPosition
- pop {pc}
- .align 2, 0
-_0808DB50: .4byte gPlayerEntity
diff --git a/assets/assets.json b/assets/assets.json
index 6c4394a3..73a4cd28 100644
--- a/assets/assets.json
+++ b/assets/assets.json
@@ -43591,11 +43591,6 @@
"size": 26
},
{
- "path": "fairy/gUnk_081217A4.bin",
- "start": 1185700,
- "size": 4
- },
- {
"path": "object42/gUnk_081217B8.bin",
"start": 1185720,
"size": 4
diff --git a/data/const/object/fairy.s b/data/const/object/fairy.s
deleted file mode 100644
index 5b04aab9..00000000
--- a/data/const/object/fairy.s
+++ /dev/null
@@ -1,20 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .section .rodata
- .align 2
-
-gUnk_08121784:: @ 08121784
- .4byte sub_0808D7B4
- .4byte sub_0808D844
- .4byte sub_0808D88C
- .4byte sub_0808D958
- .4byte sub_0808D998
-
-gUnk_08121798:: @ 08121798
- .4byte sub_0808D784
- .4byte sub_0808D798
- .4byte sub_0808D7A0
-
-gUnk_081217A4:: @ 081217A4
- .incbin "fairy/gUnk_081217A4.bin"
diff --git a/include/object.h b/include/object.h
index 93856cbf..655a1bf6 100644
--- a/include/object.h
+++ b/include/object.h
@@ -290,7 +290,7 @@ void MacroPlayer(Entity*);
void Object3D(Entity*);
void Object3E();
void GiantLeaf(Entity*);
-void Fairy(Entity*);
+void Fairy();
void LadderUp(Entity*);
void Object42(Entity*);
void Object43(Entity*);
diff --git a/linker.ld b/linker.ld
index 6b20c529..d881f027 100644
--- a/linker.ld
+++ b/linker.ld
@@ -710,7 +710,7 @@ SECTIONS {
asm/object/object3D.o(.text);
src/object/object3E.o(.text);
src/object/giantLeaf.o(.text);
- asm/object/fairy.o(.text);
+ src/object/fairy.o(.text);
asm/object/ladderUp.o(.text);
asm/object/object42.o(.text);
asm/object/object43.o(.text);
@@ -1446,7 +1446,7 @@ SECTIONS {
data/const/object/object3D.o(.rodata);
src/object/object3E.o(.rodata);
data/const/object/giantLeaf.o(.rodata);
- data/const/object/fairy.o(.rodata);
+ src/object/fairy.o(.rodata);
data/const/object/object42.o(.rodata);
data/const/object/object43.o(.rodata);
data/animations/object/object43.o(.rodata);
diff --git a/src/object/fairy.c b/src/object/fairy.c
new file mode 100644
index 00000000..0b363cc6
--- /dev/null
+++ b/src/object/fairy.c
@@ -0,0 +1,259 @@
+/**
+ * @file fairy.c
+ * @ingroup Objects
+ *
+ * @brief Fairy object
+ */
+
+#define NENT_DEPRECATED
+#include "global.h"
+#include "object.h"
+#include "functions.h"
+#include "item.h"
+
+typedef struct {
+ /*0x00*/ Entity base;
+ /*0x68*/ u8 unk_68[0xc];
+ /*0x74*/ u16 unk_74;
+ /*0x76*/ u16 unk_76;
+ /*0x78*/ u16 unk_78;
+ /*0x7a*/ u8 unk_7a[0xd];
+ /*0x87*/ u8 unk_87;
+} FairyEntity;
+
+extern Hitbox gUnk_080FD1A8;
+
+void sub_0808D76C(FairyEntity*);
+void sub_0808DAD0(FairyEntity*);
+void sub_0808DB2C(FairyEntity*);
+bool32 sub_0808DAA0(FairyEntity*);
+void Fairy_Init(FairyEntity*);
+void Fairy_Action1(FairyEntity*);
+void Fairy_Action2(FairyEntity*);
+void Fairy_Action3(FairyEntity*);
+void Fairy_Action4(FairyEntity*);
+void Fairy_SubAction0(FairyEntity*);
+void Fairy_SubAction1(FairyEntity*);
+void Fairy_SubAction2(FairyEntity*);
+
+void Fairy(FairyEntity* this) {
+ static void (*const Fairy_Actions[])(FairyEntity*) = {
+ Fairy_Init, Fairy_Action1, Fairy_Action2, Fairy_Action3, Fairy_Action4,
+ };
+
+ if (((super->bitfield & 0x80) != 0)) {
+ switch (super->bitfield & 0x7f) {
+ case 0x14:
+ super->action = 3;
+ super->flags &= ~ENT_COLLIDE;
+ super->spriteSettings.draw = 1;
+ super->child = super->field_0x4c;
+ break;
+ case 0x1f:
+ DeleteThisEntity();
+ case 0:
+ case 1:
+ case 4:
+ case 5:
+ case 6:
+ case 8:
+ case 9:
+ case 10:
+ case 0xb:
+ case 0xc:
+ case 0x1e:
+ sub_0808DAD0(this);
+ break;
+ case 0x13:
+ sub_0808D76C(this);
+ return;
+ }
+ }
+ Fairy_Actions[super->action](this);
+ sub_08080CB4(super);
+}
+
+void sub_0808D76C(FairyEntity* this) {
+ static void (*const Fairy_SubActions[])(FairyEntity*) = {
+ Fairy_SubAction0,
+ Fairy_SubAction1,
+ Fairy_SubAction2,
+ };
+
+ Fairy_SubActions[super->subAction](this);
+}
+
+void Fairy_SubAction0(FairyEntity* this) {
+ super->subAction = 1;
+ super->field_0x1d = 1;
+ super->spriteSettings.draw = 1;
+}
+
+void Fairy_SubAction1(FairyEntity* this) {
+ sub_0806F4E8(super);
+}
+
+void Fairy_SubAction2(FairyEntity* this) {
+ if (sub_0806F3E4(super)) {
+ sub_0808DB2C(this);
+ }
+}
+
+void Fairy_Init(FairyEntity* this) {
+ super->collisionLayer = 3;
+ super->field_0x3c = 0x17;
+ super->hurtType = 0x49;
+ super->hitType = 7;
+ super->flags2 = 0x17;
+ super->health = 0xff;
+ super->hitbox = (Hitbox*)&gUnk_080FD1A8;
+ super->field_0x1c = 1;
+ this->unk_74 = super->x.HALF.HI;
+ this->unk_76 = super->y.HALF.HI;
+ SetDefaultPriority(super, 6);
+ EnqueueSFX(SFX_136);
+
+ switch (super->type2) {
+ case 0:
+ super->zVelocity = 0x1e000;
+ super->z.HALF.HI += 8;
+ // fallthrough
+ default:
+ super->action = 1;
+ break;
+ case 2:
+ sub_0808DAD0(this);
+ break;
+ case 3:
+ sub_0808DB2C(this);
+ break;
+ }
+}
+
+void Fairy_Action1(FairyEntity* this) {
+ super->z.WORD -= 0xe000;
+ if (super->frame != 0) {
+ if (super->actionDelay != 0) {
+ this->unk_78 *= 0x1e;
+ } else {
+ this->unk_78 = 600;
+ }
+ super->action = 2;
+ super->field_0xf = 1;
+ super->speed = 0x80;
+ }
+}
+
+void Fairy_Action2(FairyEntity* this) {
+ static const u8 gUnk_081217A4[] = {
+ 128,
+ 96,
+ 0,
+ 0,
+ };
+ if (--super->field_0xf == 0) {
+ u32 rand = Random();
+ super->flags |= ENT_COLLIDE;
+ super->field_0xf = 0x20;
+ super->speed = (u16)gUnk_081217A4[rand >> 8 & 1];
+ if (sub_0808DAA0(this)) {
+ super->direction = rand & 0x1f;
+ } else {
+ super->direction = CalculateDirectionTo(super->x.HALF.HI, super->y.HALF.HI, this->unk_74, this->unk_76);
+ }
+ if ((super->direction & 0xf) != 0) {
+ super->spriteSettings.flipX = ((super->direction ^ 0x10) >> 4);
+ }
+ }
+ ProcessMovement1(super);
+ if ((AnyPrioritySet() == 0) && (super->type2 == 0)) {
+ if (--this->unk_78 == 0) {
+ sub_08081404(super, 0);
+ }
+ if (this->unk_78 < 0x78) {
+ super->spriteSettings.draw ^= 1;
+ }
+ }
+}
+
+void Fairy_Action3(FairyEntity* this) {
+ if (*(u16*)&super->child->kind != 0x308) {
+ sub_08081404(super, 0);
+ } else {
+ CopyPosition(super->child, super);
+ super->z.HALF.HI--;
+ if (IsColliding(super, &gPlayerEntity)) {
+ sub_0808DB2C(this);
+ }
+ }
+}
+
+void Fairy_Action4(FairyEntity* this) {
+ Entity* child;
+ s32 tmp;
+
+ child = super->child;
+ tmp = gSineTable[super->actionDelay] * 0xa00;
+ if (tmp < 0) {
+ tmp += 0xffff;
+ }
+ super->x.HALF.HI = (tmp >> 0x10) + child->x.HALF.HI;
+ tmp = gSineTable[super->actionDelay + 0x40] * 0x500;
+ if (tmp < 0) {
+ tmp += 0xffff;
+ }
+ super->y.HALF.HI = child->y.HALF.HI - (tmp >> 0x10);
+ super->actionDelay += 8;
+ super->z.HALF.HI = child->z.HALF.HI;
+ super->spriteOrientation.flipY = child->spriteOrientation.flipY;
+ super->spriteRendering.b3 = child->spriteRendering.b3;
+ if ((u8)(super->actionDelay - 0x41) < 0x7f) {
+ super->spritePriority.b0 = 3;
+ } else {
+ super->spritePriority.b0 = 5;
+ }
+ if (--super->field_0xf == 0) {
+ super->field_0xf = 6;
+ if (((--super->spriteOffsetY) * 0x1000000) >> 0x18 < -0x16) {
+ sub_08081404(super, 1);
+ }
+ }
+ if (super->spriteOffsetY < -0x11) {
+ super->spriteSettings.draw ^= 1;
+ }
+ if (this->unk_87 > 10) {
+ this->unk_87 = 10;
+ }
+}
+
+bool32 sub_0808DAA0(FairyEntity* this) {
+ if (((super->x.HALF.HI - (u32)this->unk_74) + 0x30 < 0x61) &&
+ ((super->y.HALF.HI - (u32)this->unk_76) + 0x30 < 0x61)) {
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+void sub_0808DAD0(FairyEntity* this) {
+ if (super->health == 0) {
+ DeleteThisEntity();
+ }
+ super->action = 4;
+ super->actionDelay = 0x80;
+ super->field_0xf = 6;
+ super->flags &= ~ENT_COLLIDE;
+ super->spriteSettings.draw = 1;
+ super->spritePriority.b1 = 2;
+ super->spriteOffsetY = -5;
+ super->child = &gPlayerEntity;
+ CopyPosition(&gPlayerEntity, super);
+}
+
+void sub_0808DB2C(FairyEntity* this) {
+ super->action = 2;
+ super->subAction = 0;
+ super->flags |= ENT_COLLIDE;
+ super->flags2 = 1;
+ CopyPosition(&gPlayerEntity, super);
+}
diff --git a/src/object/itemOnGround.c b/src/object/itemOnGround.c
index 49503916..7921fc39 100644
--- a/src/object/itemOnGround.c
+++ b/src/object/itemOnGround.c
@@ -19,7 +19,6 @@ void sub_080813BC(Entity*);
void sub_080810FC(Entity*);
bool32 CheckShouldPlayItemGetCutscene(Entity*);
-extern u32 IsColliding(Entity*, Entity*);
extern void GiveItem(u32, u32);
extern void (*const gUnk_0811E7D4[])(Entity*);