summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotyourav <65437533+notyourav@users.noreply.github.com>2021-02-24 16:30:18 -0800
committerGitHub <noreply@github.com>2021-02-24 16:30:18 -0800
commitaba558455a7831370b5dc1f249f54fbb52eb2450 (patch)
tree7cdf81d789271952ca3d83a15fb737cdf873c7ed
parent870f735dbfa9f473ec2f90a120f9f9aaf03daf14 (diff)
parent94b4a2b99ac50525b5724262b07785abc382351d (diff)
Merge pull request #123 from octorock/ezlo-cap
-rw-r--r--asm/ezloCap.s645
-rw-r--r--asm/non_matching/ezloCap/sub_0806D8A0.inc55
-rw-r--r--asm/non_matching/ezloCap/sub_0806D908.inc32
-rw-r--r--asm/non_matching/ezloCap/sub_0806DA04.inc15
-rw-r--r--include/functions.h2
-rw-r--r--linker.ld2
-rw-r--r--src/ezloCap.c277
7 files changed, 381 insertions, 647 deletions
diff --git a/asm/ezloCap.s b/asm/ezloCap.s
deleted file mode 100644
index 0c0c0d46..00000000
--- a/asm/ezloCap.s
+++ /dev/null
@@ -1,645 +0,0 @@
- .include "asm/macros.inc"
-
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-
- thumb_func_start EzloCap
-EzloCap: @ 0x0806D86C
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xc]
- cmp r0, #0
- bne _0806D888
- adds r0, #1
- strb r0, [r4, #0xc]
- adds r0, r4, #0
- movs r1, #2
- bl sub_0805E3A0
- adds r0, r4, #0
- bl sub_0807DD50
-_0806D888:
- adds r0, r4, #0
- movs r1, #0
- bl sub_0807DDAC
- adds r0, r4, #0
- bl sub_0807DDE4
- adds r0, r4, #0
- bl UpdateAnimationSingleFrame
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0806D8A0
-sub_0806D8A0: @ 0x0806D8A0
- push {r4, r5, lr}
- adds r4, r0, #0
- adds r3, r1, #0
- movs r2, #0
- movs r0, #8
- strb r0, [r3, #0x19]
- ldr r0, [r3, #8]
- movs r1, #2
- orrs r0, r1
- str r0, [r3, #8]
- str r2, [r3, #0x14]
- movs r2, #0x10
- ldrb r0, [r4, #0x18]
- lsls r0, r0, #0x19
- cmp r0, #0
- bge _0806D8C2
- rsbs r2, r2, #0
-_0806D8C2:
- ldr r1, _0806D900 @ =gPlayerEntity
- movs r5, #0x2e
- ldrsh r0, [r1, r5]
- adds r2, r2, r0
- movs r0, #0x32
- ldrsh r1, [r1, r0]
- adds r1, #2
- strh r2, [r3, #0x1e]
- strh r1, [r3, #0x22]
- movs r3, #0x2e
- ldrsh r0, [r4, r3]
- subs r2, r2, r0
- movs r5, #0x32
- ldrsh r0, [r4, r5]
- subs r1, r1, r0
- adds r0, r2, #0
- bl sub_080045DA
- strb r0, [r4, #0x15]
- ldrb r2, [r4, #0x14]
- movs r1, #0x80
- ands r1, r2
- ldr r2, _0806D904 @ =gUnk_08114134
- lsls r0, r0, #0x18
- lsrs r0, r0, #0x1c
- adds r0, r0, r2
- ldrb r0, [r0]
- orrs r1, r0
- strb r1, [r4, #0x14]
- pop {r4, r5, pc}
- .align 2, 0
-_0806D900: .4byte gPlayerEntity
-_0806D904: .4byte gUnk_08114134
-
- thumb_func_start sub_0806D908
-sub_0806D908: @ 0x0806D908
- push {r4, r5, lr}
- adds r4, r0, #0
- movs r1, #0x2e
- ldrsh r0, [r4, r1]
- movs r2, #0x32
- ldrsh r1, [r4, r2]
- ldr r3, _0806D93C @ =gPlayerEntity
- movs r5, #0x2e
- ldrsh r2, [r3, r5]
- movs r5, #0x32
- ldrsh r3, [r3, r5]
- bl sub_080045D4
- strb r0, [r4, #0x15]
- ldrb r2, [r4, #0x14]
- movs r1, #0x80
- ands r1, r2
- ldr r2, _0806D940 @ =gUnk_08114144
- lsls r0, r0, #0x18
- lsrs r0, r0, #0x19
- adds r0, r0, r2
- ldrb r0, [r0]
- orrs r1, r0
- strb r1, [r4, #0x14]
- pop {r4, r5, pc}
- .align 2, 0
-_0806D93C: .4byte gPlayerEntity
-_0806D940: .4byte gUnk_08114144
-
- thumb_func_start sub_0806D944
-sub_0806D944: @ 0x0806D944
- push {lr}
- adds r2, r0, #0
- ldrb r0, [r2, #0x18]
- movs r3, #0x41
- rsbs r3, r3, #0
- ands r3, r0
- strb r3, [r2, #0x18]
- ldr r0, _0806D968 @ =gPlayerEntity
- ldr r1, [r2, #0x2c]
- ldr r0, [r0, #0x2c]
- cmp r1, r0
- bgt _0806D964
- movs r1, #0x40
- adds r0, r3, #0
- orrs r0, r1
- strb r0, [r2, #0x18]
-_0806D964:
- pop {pc}
- .align 2, 0
-_0806D968: .4byte gPlayerEntity
-
- thumb_func_start sub_0806D96C
-sub_0806D96C: @ 0x0806D96C
- push {r4, lr}
- adds r4, r0, #0
- movs r1, #0x42
- movs r2, #0
- bl CreateFx
- adds r2, r0, #0
- cmp r2, #0
- beq _0806D99C
- adds r3, r2, #0
- adds r3, #0x29
- ldrb r1, [r3]
- movs r0, #8
- rsbs r0, r0, #0
- ands r0, r1
- movs r1, #1
- orrs r0, r1
- strb r0, [r3]
- ldr r3, _0806D9A0 @ =0xFFE80000
- adds r0, r4, #0
- adds r1, r2, #0
- movs r2, #0
- bl PositionRelative
-_0806D99C:
- pop {r4, pc}
- .align 2, 0
-_0806D9A0: .4byte 0xFFE80000
-
- thumb_func_start sub_0806D9A4
-sub_0806D9A4: @ 0x0806D9A4
- push {lr}
- ldr r1, _0806D9BC @ =gPlayerEntity
- ldr r2, [r0, #0x2c]
- ldr r0, [r1, #0x2c]
- adds r3, r1, #0
- cmp r2, r0
- bgt _0806D9C0
- ldrb r1, [r3, #0x18]
- movs r0, #0x41
- rsbs r0, r0, #0
- ands r0, r1
- b _0806D9C6
- .align 2, 0
-_0806D9BC: .4byte gPlayerEntity
-_0806D9C0:
- ldrb r0, [r3, #0x18]
- movs r1, #0x40
- orrs r0, r1
-_0806D9C6:
- strb r0, [r3, #0x18]
- movs r0, #4
- strb r0, [r3, #0x14]
- pop {pc}
- .align 2, 0
-
- thumb_func_start NPC4E
-NPC4E: @ 0x0806D9D0
- push {lr}
- adds r2, r0, #0
- ldrb r0, [r2, #0xc]
- cmp r0, #0
- bne _0806D9F8
- movs r0, #1
- strb r0, [r2, #0xc]
- ldrb r1, [r2, #0x18]
- subs r0, #5
- ands r0, r1
- strb r0, [r2, #0x18]
- ldr r0, _0806D9F4 @ =gUnk_080FD170
- str r0, [r2, #0x48]
- adds r0, r2, #0
- bl sub_0807DD50
- b _0806DA00
- .align 2, 0
-_0806D9F4: .4byte gUnk_080FD170
-_0806D9F8:
- adds r0, r2, #0
- movs r1, #0
- bl sub_0807DD94
-_0806DA00:
- pop {pc}
- .align 2, 0
-
- thumb_func_start sub_0806DA04
-sub_0806DA04: @ 0x0806DA04
- push {lr}
- ldr r3, [r1, #4]
- lsls r3, r3, #3
- ldr r1, _0806DA18 @ =gUnk_0811415C
- adds r3, r3, r1
- ldrb r2, [r3, #4]
- movs r1, #1
- bl sub_08078850
- pop {pc}
- .align 2, 0
-_0806DA18: .4byte gUnk_0811415C
-
- thumb_func_start sub_0806DA1C
-sub_0806DA1C: @ 0x0806DA1C
- push {lr}
- ldr r3, _0806DA34 @ =gUnk_081141A4
- ldr r2, [r1, #4]
- lsls r0, r2, #2
- adds r0, r0, r3
- ldr r0, [r0]
- ldr r1, _0806DA38 @ =gUnk_081141E4
- adds r2, r2, r1
- ldrb r1, [r2]
- bl sub_0808091C
- pop {pc}
- .align 2, 0
-_0806DA34: .4byte gUnk_081141A4
-_0806DA38: .4byte gUnk_081141E4
-
- thumb_func_start sub_0806DA3C
-sub_0806DA3C: @ 0x0806DA3C
- push {lr}
- adds r2, r0, #0
- ldrb r0, [r2, #0xa]
- subs r0, #1
- cmp r0, #0xa
- bhi _0806DA84
- lsls r0, r0, #2
- ldr r1, _0806DA54 @ =_0806DA58
- adds r0, r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0806DA54: .4byte _0806DA58
-_0806DA58: @ jump table
- .4byte _0806DA88 @ case 0
- .4byte _0806DA8C @ case 1
- .4byte _0806DA90 @ case 2
- .4byte _0806DA94 @ case 3
- .4byte _0806DA98 @ case 4
- .4byte _0806DAA0 @ case 5
- .4byte _0806DAA0 @ case 6
- .4byte _0806DAA0 @ case 7
- .4byte _0806DAA0 @ case 8
- .4byte _0806DAA0 @ case 9
- .4byte _0806DA9C @ case 10
-_0806DA84:
- movs r0, #0
- b _0806DAA6
-_0806DA88:
- movs r0, #1
- b _0806DAA6
-_0806DA8C:
- movs r0, #2
- b _0806DAA6
-_0806DA90:
- movs r0, #3
- b _0806DAA6
-_0806DA94:
- movs r0, #4
- b _0806DAA6
-_0806DA98:
- movs r0, #5
- b _0806DAA6
-_0806DA9C:
- movs r0, #9
- b _0806DAA6
-_0806DAA0:
- adds r0, r2, #0
- bl sub_0801E99C
-_0806DAA6:
- lsls r0, r0, #0x18
- lsrs r0, r0, #0x18
- pop {pc}
-
- thumb_func_start sub_0806DAAC
-sub_0806DAAC: @ 0x0806DAAC
- push {r4, lr}
- adds r4, r1, #0
- bl sub_0806DA3C
- lsls r0, r0, #0x18
- lsrs r0, r0, #0x18
- bl CheckKinstoneFused
- str r0, [r4, #0x14]
- ldr r2, _0806DACC @ =gUnk_02033280
- ldrb r1, [r2, #7]
- movs r0, #1
- orrs r0, r1
- strb r0, [r2, #7]
- pop {r4, pc}
- .align 2, 0
-_0806DACC: .4byte gUnk_02033280
-
- thumb_func_start sub_0806DAD0
-sub_0806DAD0: @ 0x0806DAD0
- push {r4, lr}
- adds r4, r0, #0
- bl sub_0806DA3C
- adds r1, r0, #0
- lsls r1, r1, #0x18
- lsrs r1, r1, #0x18
- adds r0, r4, #0
- bl sub_08078790
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0806DAE8
-sub_0806DAE8: @ 0x0806DAE8
- push {lr}
- ldrb r0, [r0, #0xa]
- subs r0, #1
- cmp r0, #4
- bhi _0806DB3A
- lsls r0, r0, #2
- ldr r1, _0806DAFC @ =_0806DB00
- adds r0, r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0806DAFC: .4byte _0806DB00
-_0806DB00: @ jump table
- .4byte _0806DB14 @ case 0
- .4byte _0806DB1C @ case 1
- .4byte _0806DB24 @ case 2
- .4byte _0806DB2C @ case 3
- .4byte _0806DB34 @ case 4
-_0806DB14:
- movs r0, #0xee
- bl SetLocalFlag
- b _0806DB3A
-_0806DB1C:
- movs r0, #0xef
- bl SetLocalFlag
- b _0806DB3A
-_0806DB24:
- movs r0, #0xf0
- bl SetLocalFlag
- b _0806DB3A
-_0806DB2C:
- movs r0, #0xf1
- bl SetLocalFlag
- b _0806DB3A
-_0806DB34:
- movs r0, #0xf2
- bl SetLocalFlag
-_0806DB3A:
- movs r0, #0xcd
- bl PlaySFX
- pop {pc}
- .align 2, 0
-
- thumb_func_start sub_0806DB44
-sub_0806DB44: @ 0x0806DB44
- push {r4, lr}
- adds r4, r1, #0
- movs r0, #0
- str r0, [r4, #0x14]
- movs r0, #0xee
- bl CheckLocalFlag
- cmp r0, #0
- beq _0806DB82
- movs r0, #0xef
- bl CheckLocalFlag
- cmp r0, #0
- beq _0806DB82
- movs r0, #0xf0
- bl CheckLocalFlag
- cmp r0, #0
- beq _0806DB82
- movs r0, #0xf1
- bl CheckLocalFlag
- cmp r0, #0
- beq _0806DB82
- movs r0, #0xf2
- bl CheckLocalFlag
- cmp r0, #0
- beq _0806DB82
- movs r0, #1
- str r0, [r4, #0x14]
-_0806DB82:
- pop {r4, pc}
-
- thumb_func_start sub_0806DB84
-sub_0806DB84: @ 0x0806DB84
- push {r4, r5, lr}
- adds r5, r0, #0
- ldr r0, _0806DBE4 @ =gUnk_08114154
- str r0, [r5, #0x48]
- movs r0, #0x3e
- movs r1, #4
- movs r2, #0
- bl CreateObject
- adds r4, r0, #0
- cmp r4, #0
- beq _0806DBB6
- ldr r2, _0806DBE8 @ =0xFFF80000
- adds r0, r5, #0
- adds r1, r4, #0
- movs r3, #0
- bl PositionRelative
- ldr r1, _0806DBEC @ =gUnk_08016030
- adds r0, r4, #0
- bl StartCutscene
- adds r1, r4, #0
- adds r1, #0x84
- str r0, [r1]
-_0806DBB6:
- movs r0, #0x3e
- movs r1, #5
- movs r2, #0
- bl CreateObject
- adds r4, r0, #0
- cmp r4, #0
- beq _0806DBE2
- movs r2, #0x80
- lsls r2, r2, #0xc
- adds r0, r5, #0
- adds r1, r4, #0
- movs r3, #0
- bl PositionRelative
- ldr r1, _0806DBF0 @ =gUnk_0801606C
- adds r0, r4, #0
- bl StartCutscene
- adds r1, r4, #0
- adds r1, #0x84
- str r0, [r1]
-_0806DBE2:
- pop {r4, r5, pc}
- .align 2, 0
-_0806DBE4: .4byte gUnk_08114154
-_0806DBE8: .4byte 0xFFF80000
-_0806DBEC: .4byte gUnk_08016030
-_0806DBF0: .4byte gUnk_0801606C
-
- thumb_func_start sub_0806DBF4
-sub_0806DBF4: @ 0x0806DBF4
- push {r4, lr}
- adds r4, r0, #0
- cmp r4, #1
- blo _0806DC36
- cmp r4, #4
- bls _0806DC04
- cmp r4, #6
- bne _0806DC36
-_0806DC04:
- movs r4, #1
- movs r0, #2
- bl GetInventoryValue
- cmp r0, #0
- beq _0806DC12
- movs r4, #2
-_0806DC12:
- movs r0, #3
- bl GetInventoryValue
- cmp r0, #0
- beq _0806DC1E
- movs r4, #3
-_0806DC1E:
- movs r0, #4
- bl GetInventoryValue
- cmp r0, #0
- beq _0806DC2A
- movs r4, #4
-_0806DC2A:
- movs r0, #6
- bl GetInventoryValue
- cmp r0, #0
- beq _0806DC36
- movs r4, #6
-_0806DC36:
- adds r0, r4, #0
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0806DC3C
-sub_0806DC3C: @ 0x0806DC3C
- ldr r2, _0806DC54 @ =gSave
- adds r1, r2, #0
- adds r1, #0xb4
- ldrb r3, [r1]
- adds r1, r0, #0
- adds r1, #0x68
- strb r3, [r1]
- adds r2, #0xb5
- ldrb r1, [r2]
- adds r0, #0x69
- strb r1, [r0]
- bx lr
- .align 2, 0
-_0806DC54: .4byte gSave
-
- thumb_func_start sub_0806DC58
-sub_0806DC58: @ 0x0806DC58
- push {r4, lr}
- adds r4, r0, #0
- adds r0, #0x68
- ldrb r0, [r0]
- bl sub_0806DBF4
- movs r1, #0
- bl ForceEquipItem
- adds r4, #0x69
- ldrb r0, [r4]
- bl sub_0806DBF4
- movs r1, #1
- bl ForceEquipItem
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0806DC7C
-sub_0806DC7C: @ 0x0806DC7C
- push {r4, lr}
- ldr r4, _0806DC84 @ =gUnk_081141F4
- b _0806DC94
- .align 2, 0
-_0806DC84: .4byte gUnk_081141F4
-_0806DC88:
- ldrh r1, [r4]
- adds r4, #2
- ldr r0, _0806DC9C @ =0x00004072
- movs r2, #1
- bl SetTileType
-_0806DC94:
- ldrh r0, [r4]
- cmp r0, #0
- bne _0806DC88
- pop {r4, pc}
- .align 2, 0
-_0806DC9C: .4byte 0x00004072
-
- thumb_func_start sub_0806DCA0
-sub_0806DCA0: @ 0x0806DCA0
- push {r4, lr}
- ldr r4, _0806DCA8 @ =gUnk_081141F4
- b _0806DCB6
- .align 2, 0
-_0806DCA8: .4byte gUnk_081141F4
-_0806DCAC:
- ldrh r0, [r4]
- adds r4, #2
- movs r1, #1
- bl sub_0807BA8C
-_0806DCB6:
- ldrh r0, [r4]
- cmp r0, #0
- bne _0806DCAC
- pop {r4, pc}
- .align 2, 0
-
- thumb_func_start sub_0806DCC0
-sub_0806DCC0: @ 0x0806DCC0
- ldr r0, _0806DCD0 @ =gScreenTransition
- movs r1, #0xf9
- lsls r1, r1, #3
- strh r1, [r0, #0x20]
- movs r1, #0xf8
- strh r1, [r0, #0x22]
- bx lr
- .align 2, 0
-_0806DCD0: .4byte gScreenTransition
-
- thumb_func_start NPC4E_Fusion
-NPC4E_Fusion: @ 0x0806DCD4
- push {r4, lr}
- adds r4, r0, #0
- ldrb r0, [r4, #0xc]
- cmp r0, #0
- bne _0806DD40
- adds r0, #1
- strb r0, [r4, #0xc]
- ldrb r0, [r4, #0xa]
- subs r0, #1
- cmp r0, #0xa
- bhi _0806DD40
- lsls r0, r0, #2
- ldr r1, _0806DCF4 @ =_0806DCF8
- adds r0, r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_0806DCF4: .4byte _0806DCF8
-_0806DCF8: @ jump table
- .4byte _0806DD24 @ case 0
- .4byte _0806DD24 @ case 1
- .4byte _0806DD24 @ case 2
- .4byte _0806DD24 @ case 3
- .4byte _0806DD24 @ case 4
- .4byte _0806DD2C @ case 5
- .4byte _0806DD2C @ case 6
- .4byte _0806DD2C @ case 7
- .4byte _0806DD2C @ case 8
- .4byte _0806DD2C @ case 9
- .4byte _0806DD34 @ case 10
-_0806DD24:
- adds r0, r4, #0
- bl sub_0809623C
- b _0806DD40
-_0806DD2C:
- adds r0, r4, #0
- bl sub_08096260
- b _0806DD40
-_0806DD34:
- adds r0, r4, #0
- movs r1, #0
- bl sub_0806DB84
- movs r0, #0
- str r0, [r4, #0x48]
-_0806DD40:
- pop {r4, pc}
- .align 2, 0
diff --git a/asm/non_matching/ezloCap/sub_0806D8A0.inc b/asm/non_matching/ezloCap/sub_0806D8A0.inc
new file mode 100644
index 00000000..64c18349
--- /dev/null
+++ b/asm/non_matching/ezloCap/sub_0806D8A0.inc
@@ -0,0 +1,55 @@
+ .syntax unified
+
+ .text
+
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ adds r3, r1, #0
+ movs r2, #0
+ movs r0, #8
+ strb r0, [r3, #0x19]
+ ldr r0, [r3, #8]
+ movs r1, #2
+ orrs r0, r1
+ str r0, [r3, #8]
+ str r2, [r3, #0x14]
+ movs r2, #0x10
+ ldrb r0, [r4, #0x18]
+ lsls r0, r0, #0x19
+ cmp r0, #0
+ bge _0806D8C2
+ rsbs r2, r2, #0
+_0806D8C2:
+ ldr r1, _0806D900 @ =gPlayerEntity
+ movs r5, #0x2e
+ ldrsh r0, [r1, r5]
+ adds r2, r2, r0
+ movs r0, #0x32
+ ldrsh r1, [r1, r0]
+ adds r1, #2
+ strh r2, [r3, #0x1e]
+ strh r1, [r3, #0x22]
+ movs r3, #0x2e
+ ldrsh r0, [r4, r3]
+ subs r2, r2, r0
+ movs r5, #0x32
+ ldrsh r0, [r4, r5]
+ subs r1, r1, r0
+ adds r0, r2, #0
+ bl sub_080045DA
+ strb r0, [r4, #0x15]
+ ldrb r2, [r4, #0x14]
+ movs r1, #0x80
+ ands r1, r2
+ ldr r2, _0806D904 @ =gUnk_08114134
+ lsls r0, r0, #0x18
+ lsrs r0, r0, #0x1c
+ adds r0, r0, r2
+ ldrb r0, [r0]
+ orrs r1, r0
+ strb r1, [r4, #0x14]
+ pop {r4, r5, pc}
+ .align 2, 0
+_0806D900: .4byte gPlayerEntity
+_0806D904: .4byte gUnk_08114134
+ .syntax divided
diff --git a/asm/non_matching/ezloCap/sub_0806D908.inc b/asm/non_matching/ezloCap/sub_0806D908.inc
new file mode 100644
index 00000000..d8e1a399
--- /dev/null
+++ b/asm/non_matching/ezloCap/sub_0806D908.inc
@@ -0,0 +1,32 @@
+ .syntax unified
+
+ .text
+
+ push {r4, r5, lr}
+ adds r4, r0, #0
+ movs r1, #0x2e
+ ldrsh r0, [r4, r1]
+ movs r2, #0x32
+ ldrsh r1, [r4, r2]
+ ldr r3, _0806D93C @ =gPlayerEntity
+ movs r5, #0x2e
+ ldrsh r2, [r3, r5]
+ movs r5, #0x32
+ ldrsh r3, [r3, r5]
+ bl sub_080045D4
+ strb r0, [r4, #0x15]
+ ldrb r2, [r4, #0x14]
+ movs r1, #0x80
+ ands r1, r2
+ ldr r2, _0806D940 @ =gUnk_08114144
+ lsls r0, r0, #0x18
+ lsrs r0, r0, #0x19
+ adds r0, r0, r2
+ ldrb r0, [r0]
+ orrs r1, r0
+ strb r1, [r4, #0x14]
+ pop {r4, r5, pc}
+ .align 2, 0
+_0806D93C: .4byte gPlayerEntity
+_0806D940: .4byte gUnk_08114144
+ .syntax divided
diff --git a/asm/non_matching/ezloCap/sub_0806DA04.inc b/asm/non_matching/ezloCap/sub_0806DA04.inc
new file mode 100644
index 00000000..4b0ae7b6
--- /dev/null
+++ b/asm/non_matching/ezloCap/sub_0806DA04.inc
@@ -0,0 +1,15 @@
+ .syntax unified
+ .text
+
+ push {lr}
+ ldr r3, [r1, #4]
+ lsls r3, r3, #3
+ ldr r1, _0806DA18 @ =gUnk_0811415C
+ adds r3, r3, r1
+ ldrb r2, [r3, #4]
+ movs r1, #1
+ bl sub_08078850
+ pop {pc}
+ .align 2, 0
+_0806DA18: .4byte gUnk_0811415C
+ .syntax divided \ No newline at end of file
diff --git a/include/functions.h b/include/functions.h
index 9e8b7d0b..6a7b37e7 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -20,7 +20,7 @@ extern u32 __modsi3(u32, u32);
extern void DoFade(u32, u32);
extern u32 GetInventoryValue(u32);
extern u32 CheckKinstoneFused(u32);
-extern void ForceEquipItem(u8, u8);
+extern void ForceEquipItem(u32, u8);
extern void LoadRoomEntityList();
void CopyPosition(Entity*, Entity*);
extern void ResolveEntityOnTop(Entity*, Entity*);
diff --git a/linker.ld b/linker.ld
index 2ae62d6e..8174f3da 100644
--- a/linker.ld
+++ b/linker.ld
@@ -627,7 +627,7 @@ SECTIONS {
src/npc/mayorHagen.o(.text);
src/npc/bigGoron.o(.text);
asm/bigGoron.o(.text);
- asm/ezloCap.o(.text);
+ src/ezloCap.o(.text);
asm/npc4E.o(.text);
src/npc/clothesRack.o(.text);
asm/clothesRack.o(.text);
diff --git a/src/ezloCap.c b/src/ezloCap.c
new file mode 100644
index 00000000..c4e92aba
--- /dev/null
+++ b/src/ezloCap.c
@@ -0,0 +1,277 @@
+#include "global.h"
+#include "entity.h"
+#include "functions.h"
+#include "flags.h"
+#include "save.h"
+#include "script.h"
+
+extern BoundingBox gUnk_080FD170;
+
+extern u16* gUnk_08114144;
+
+extern u32 gUnk_081141A4[];
+extern u8 gUnk_081141E4[];
+
+extern BoundingBox gUnk_08114154;
+extern void gUnk_08016030; // Cutscene data type?
+extern void gUnk_0801606C; // Cutscene data type?
+
+extern void gUnk_081141F4; // tiles that are changed?
+
+extern void sub_0809623C(Entity*);
+extern void sub_08096260(Entity*);
+
+void EzloCap(Entity* this) {
+ if (this->action == 0) {
+ this->action += 1;
+ sub_0805E3A0(this, 2);
+ sub_0807DD50(this);
+ }
+ sub_0807DDAC(this, 0);
+ sub_0807DDE4(this);
+ UpdateAnimationSingleFrame(this);
+}
+
+NONMATCH("asm/non_matching/ezloCap/sub_0806D8A0.inc", void sub_0806D8A0(Entity* this, u32 param_2)) {
+}
+END_NONMATCH
+
+NONMATCH("asm/non_matching/ezloCap/sub_0806D908.inc", void sub_0806D908(Entity* this)) {
+}
+END_NONMATCH
+
+void sub_0806D944(Entity* this) {
+ this->spriteSettings.b.flipX = 0;
+ if (this->x.WORD <= gPlayerEntity.x.WORD) {
+ this->spriteSettings.b.flipX = 1;
+ }
+}
+
+void sub_0806D96C(Entity* this) {
+ Entity* fx = CreateFx(this, 0x42, 0);
+ if (fx != NULL) {
+ fx->spritePriority.b0 = 1;
+ PositionRelative(this, fx, 0, 0xFFE80000);
+ }
+}
+
+void sub_0806D9A4(Entity* this) {
+ if (this->x.WORD <= gPlayerEntity.x.WORD) {
+ gPlayerEntity.spriteSettings.b.flipX = 0;
+ } else {
+ gPlayerEntity.spriteSettings.b.flipX = 1;
+ }
+ gPlayerEntity.animationState = 4;
+}
+
+void NPC4E(Entity* this) {
+ if (this->action == 0) {
+ this->action = 1;
+ this->spriteSettings.b.draw = 4;
+ this->boundingBox = &gUnk_080FD170;
+ sub_0807DD50(this);
+ } else {
+ sub_0807DD94(this, 0);
+ }
+}
+
+NONMATCH("asm/non_matching/ezloCap/sub_0806DA04.inc", void sub_0806DA04(Entity* this, u32 param_2)) {
+ u8 direction =
+ sub_080045D4(this->x.HALF.HI, this->y.HALF.HI, (int)gPlayerEntity.x.HALF.HI, (int)gPlayerEntity.y.HALF.HI);
+ this->direction = direction;
+
+ this->animationState =
+ (this->animationState & 0x80) |
+ gUnk_08114144[(((direction) << 0x18) >> 0x19)]; // somehow the cast from u8 to u32 of direction is an issue here
+}
+END_NONMATCH
+
+void sub_0806DA1C(Entity* this, u32* param_2) {
+ sub_0808091C((ScreenTransitionData*)(gUnk_081141A4)[param_2[1]], (u32)(gUnk_081141E4[param_2[1]]));
+}
+
+// Returns the kingstone id?
+u8 sub_0806DA3C(Entity* this) {
+ u32 result;
+
+ switch (this->entityType.form) {
+ default:
+ result = 0;
+ break;
+ case 1:
+ result = 1;
+ break;
+ case 2:
+ result = 2;
+ break;
+ case 3:
+ result = 3;
+ break;
+ case 4:
+ result = 4;
+ break;
+ case 5:
+ result = 5;
+ break;
+ case 11:
+ result = 9;
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ result = sub_0801E99C(this);
+ break;
+ }
+ return result;
+}
+
+// Check whether a kingstone fusion is possible and store the result somewhere in param_2?
+void sub_0806DAAC(Entity* this, u32 param_2) {
+ u32 uVar1;
+ uVar1 = CheckKinstoneFused(sub_0806DA3C(this));
+ *(u32*)(param_2 + 0x14) = uVar1;
+ gUnk_02033280.unk_07 |= 1;
+}
+
+// maybe actually execute the keystone fusion?
+void sub_0806DAD0(Entity* this) {
+ sub_08078790(this, sub_0806DA3C(this));
+}
+
+void sub_0806DAE8(Entity* this) {
+ switch (this->entityType.form - 1) {
+ case 0:
+ SetLocalFlag(0xee);
+ break;
+ case 1:
+ SetLocalFlag(0xef);
+ break;
+ case 2:
+ SetLocalFlag(0xf0);
+ break;
+ case 3:
+ SetLocalFlag(0xf1);
+ break;
+ case 4:
+ SetLocalFlag(0xf2);
+ break;
+ }
+
+ PlaySFX(0xcd);
+}
+
+// Unknown param_2 struct
+void sub_0806DB44(Entity* this, u32* param_2) {
+ param_2[5] = 0;
+
+ if (CheckLocalFlag(0xee) != 0 && CheckLocalFlag(0xef) != 0 && CheckLocalFlag(0xf0) != 0 &&
+ CheckLocalFlag(0xf1) != 0 && CheckLocalFlag(0xf2) != 0) {
+ param_2[5] = 1;
+ }
+}
+
+void sub_0806DB84(
+ Entity* this,
+ u8 unused) { // The unused param just had to be added, so that a mov r1, #0 in NPC4E_Fusion is matching correctly
+ Entity* ent;
+ this->boundingBox = &gUnk_08114154;
+ ent = CreateObject(0x3e, 4, 0);
+ if (ent != NULL) {
+ PositionRelative(this, ent, -0x80000, 0);
+ *(ScriptExecutionContext**)&ent->cutsceneBeh = StartCutscene(ent, &gUnk_08016030);
+ }
+ ent = CreateObject(0x3e, 5, 0);
+ if (ent != NULL) {
+ PositionRelative(this, ent, 0x80000, 0);
+ *(ScriptExecutionContext**)&ent->cutsceneBeh = StartCutscene(ent, &gUnk_0801606C);
+ }
+}
+
+u32 sub_0806DBF4(u32 param_1) {
+ switch (param_1) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 6:
+ param_1 = 1;
+ if (GetInventoryValue(2) != 0) {
+ param_1 = 2;
+ }
+ if (GetInventoryValue(3) != 0) {
+ param_1 = 3;
+ }
+ if (GetInventoryValue(4) != 0) {
+ param_1 = 4;
+ }
+ if (GetInventoryValue(6) != 0) {
+ param_1 = 6;
+ }
+ break;
+ }
+ return param_1;
+}
+
+void sub_0806DC3C(Entity* this) {
+ this->field_0x68.HALF.LO = gSave.stats.itemOnA;
+ this->field_0x68.HALF.HI = gSave.stats.itemOnB;
+}
+
+void sub_0806DC58(Entity* this) {
+ ForceEquipItem(sub_0806DBF4(this->field_0x68.HALF.LO), 0);
+ ForceEquipItem(sub_0806DBF4(this->field_0x68.HALF.HI), 1);
+}
+
+void sub_0806DC7C() {
+ u16* tiles = &gUnk_081141F4;
+ while (*tiles != 0) {
+ u32 tile = (u32)*tiles;
+ tiles = tiles + 1;
+ SetTileType(0x4072, tile, 1);
+ }
+}
+
+void sub_0806DCA0() {
+ u16 uVar1;
+ u16* tiles;
+
+ tiles = &gUnk_081141F4;
+ while (*tiles != 0) {
+ u16 tile = *tiles;
+ tiles = tiles + 1;
+ sub_0807BA8C((u32)tile, 1);
+ }
+}
+
+void sub_0806DCC0() {
+ gScreenTransition.field_0x20 = 0x7c8;
+ gScreenTransition.field_0x22 = 0xf8;
+}
+
+void NPC4E_Fusion(Entity* this) {
+ if (this->action == 0) {
+ this->action += 1;
+ switch (this->entityType.form) {
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ sub_0809623C(this);
+ break;
+ case 6:
+ case 7:
+ case 8:
+ case 9:
+ case 10:
+ sub_08096260(this);
+ break;
+ case 11:
+ sub_0806DB84(this, 0);
+ this->boundingBox = NULL;
+ break;
+ }
+ }
+}