From 94b4a2b99ac50525b5724262b07785abc382351d Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Wed, 24 Feb 2021 23:02:42 +0100 Subject: [PATCH] decompile much of ezloCap.s --- asm/ezloCap.s | 645 ---------------------- asm/non_matching/ezloCap/sub_0806D8A0.inc | 55 ++ asm/non_matching/ezloCap/sub_0806D908.inc | 32 ++ asm/non_matching/ezloCap/sub_0806DA04.inc | 15 + include/functions.h | 2 +- linker.ld | 2 +- src/ezloCap.c | 277 ++++++++++ 7 files changed, 381 insertions(+), 647 deletions(-) delete mode 100644 asm/ezloCap.s create mode 100644 asm/non_matching/ezloCap/sub_0806D8A0.inc create mode 100644 asm/non_matching/ezloCap/sub_0806D908.inc create mode 100644 asm/non_matching/ezloCap/sub_0806DA04.inc create mode 100644 src/ezloCap.c 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; + } + } +}