diff --git a/asm/lockedDoor.s b/asm/lockedDoor.s deleted file mode 100644 index f59c48ab..00000000 --- a/asm/lockedDoor.s +++ /dev/null @@ -1,726 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start LockedDoor -LockedDoor: @ 0x08083320 - push {lr} - ldr r2, _08083334 @ =gUnk_0811F65C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08083334: .4byte gUnk_0811F65C - - thumb_func_start sub_08083338 -sub_08083338: @ 0x08083338 - push {r4, r5, r6, r7, lr} - adds r4, r0, #0 - adds r2, r4, #0 - adds r2, #0x84 - ldrh r1, [r2] - ldr r0, _08083400 @ =0x0000FFFF - cmp r1, r0 - beq _08083356 - adds r0, r1, #0 - bl CheckFlags - cmp r0, #0 - beq _08083356 - bl DeleteThisEntity -_08083356: - adds r0, r4, #0 - bl sub_080837B0 - cmp r0, #0 - bne _08083362 - b _080834B2 -_08083362: - ldrb r2, [r4, #0xa] - lsrs r0, r2, #2 - movs r1, #3 - ands r0, r1 - strb r0, [r4, #0xb] - movs r7, #3 - adds r0, r7, #0 - ands r0, r2 - strb r0, [r4, #0x1e] - movs r0, #0xc0 - lsls r0, r0, #2 - strh r0, [r4, #0x24] - ldrh r1, [r4, #0x2e] - adds r0, r4, #0 - adds r0, #0x70 - strh r1, [r0] - ldrh r0, [r4, #0x32] - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - ldrb r1, [r4, #0xa] - adds r0, r7, #0 - ands r0, r1 - adds r6, r4, #0 - adds r6, #0x7e - strb r0, [r6] - ldr r0, _08083404 @ =gUnk_080FD170 - str r0, [r4, #0x48] - adds r2, r4, #0 - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #5 - orrs r0, r1 - strb r0, [r2] - ldrb r1, [r4, #0xa] - movs r0, #0xf - ands r0, r1 - adds r1, r4, #0 - adds r1, #0x5a - strb r0, [r1] - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _08083408 @ =gRoomControls - ldrh r0, [r2, #6] - subs r1, r1, r0 - asrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - movs r5, #0x32 - ldrsh r0, [r4, r5] - ldrh r2, [r2, #8] - subs r0, r0, r2 - asrs r0, r0, #4 - ands r0, r3 - lsls r0, r0, #6 - orrs r1, r0 - adds r5, r4, #0 - adds r5, #0x76 - strh r1, [r5] - ldrh r0, [r5] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl sub_080001DA - adds r1, r4, #0 - adds r1, #0x74 - strh r0, [r1] - ldrb r0, [r4, #0xb] - cmp r0, #1 - beq _08083438 - cmp r0, #1 - bgt _0808340C - cmp r0, #0 - beq _08083412 - b _080834AE - .align 2, 0 -_08083400: .4byte 0x0000FFFF -_08083404: .4byte gUnk_080FD170 -_08083408: .4byte gRoomControls -_0808340C: - cmp r0, #2 - beq _08083456 - b _080834AE -_08083412: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _0808342E - ldrb r1, [r4, #0xa] - movs r0, #0x10 - ands r0, r1 - cmp r0, #0 - beq _0808344E - strb r7, [r4, #0xc] - b _080834B2 -_0808342E: - ldrb r1, [r4, #0xa] - movs r0, #0xef - ands r0, r1 - strb r0, [r4, #0xa] - b _08083446 -_08083438: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _0808344E -_08083446: - adds r0, r4, #0 - bl sub_08083638 - b _080834B2 -_0808344E: - adds r0, r4, #0 - bl sub_080836A0 - b _080834B2 -_08083456: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _080834A8 - ldrb r0, [r4, #0x1e] - movs r1, #4 - orrs r0, r1 - strb r0, [r4, #0x1e] - ldrb r1, [r6] - ldrh r2, [r5] - adds r0, r4, #0 - bl sub_080836DC - bl CheckIsDungeon - cmp r0, #0 - bne _08083484 - movs r0, #5 - strb r0, [r4, #0xc] - b _080834B2 -_08083484: - movs r0, #8 - strb r0, [r4, #0xc] - adds r0, r4, #0 - bl sub_080787CC - ldr r1, _080834A4 @ =gUnk_0811F740 - ldrb r0, [r6] - adds r0, r0, r1 - ldrb r2, [r0] - adds r0, r4, #0 - movs r1, #0 - movs r3, #0 - bl sub_08078850 - b _080834B2 - .align 2, 0 -_080834A4: .4byte gUnk_0811F740 -_080834A8: - bl DeleteThisEntity - b _080834B2 -_080834AE: - bl DeleteThisEntity -_080834B2: - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_080834B4 -sub_080834B4: @ 0x080834B4 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xe] - subs r0, #1 - strb r0, [r2, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080834E6 - movs r0, #2 - strb r0, [r2, #0xc] - movs r0, #7 - strb r0, [r2, #0xe] - adds r0, r2, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r2, #0 - adds r1, #0x76 - ldrh r1, [r1] - adds r2, #0x38 - ldrb r2, [r2] - bl SetTile - ldr r0, _080834E8 @ =0x0000010B - bl EnqueueSFX -_080834E6: - pop {pc} - .align 2, 0 -_080834E8: .4byte 0x0000010B - - thumb_func_start sub_080834EC -sub_080834EC: @ 0x080834EC - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F69C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08083516 - ldrb r1, [r4, #0xa] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08083512 - adds r0, r4, #0 - bl sub_08083638 - b _08083516 -_08083512: - bl DeleteThisEntity -_08083516: - pop {r4, pc} - - thumb_func_start sub_08083518 -sub_08083518: @ 0x08083518 - push {r4, r5, lr} - adds r4, r0, #0 - adds r5, r4, #0 - adds r5, #0x7e - ldrb r1, [r5] - bl sub_08083734 - cmp r0, #0 - beq _0808353C - movs r0, #4 - strb r0, [r4, #0xc] - ldrb r1, [r5] - adds r0, r4, #0 - adds r0, #0x76 - ldrh r2, [r0] - adds r0, r4, #0 - bl sub_080836DC -_0808353C: - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08083540 -sub_08083540: @ 0x08083540 - push {r4, lr} - adds r4, r0, #0 - bl sub_0806F69C - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0808358C - ldrb r1, [r4, #0xa] - movs r0, #0x10 - ands r0, r1 - cmp r0, #0 - beq _08083566 - movs r0, #0xef - ands r0, r1 - strb r0, [r4, #0xa] - b _0808356E -_08083566: - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _08083576 -_0808356E: - adds r0, r4, #0 - bl sub_080836A0 - b _0808357A -_08083576: - movs r0, #5 - strb r0, [r4, #0xc] -_0808357A: - adds r0, r4, #0 - adds r0, #0x7e - ldrb r1, [r0] - adds r0, r4, #0 - bl sub_08083814 - ldr r0, _08083590 @ =0x0000010B - bl EnqueueSFX -_0808358C: - pop {r4, pc} - .align 2, 0 -_08083590: .4byte 0x0000010B - - thumb_func_start nullsub_513 -nullsub_513: @ 0x08083594 - bx lr - .align 2, 0 - - thumb_func_start sub_08083598 -sub_08083598: @ 0x08083598 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _080835B2 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _080835C6 - b _080835C0 -_080835B2: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _080835C6 -_080835C0: - adds r0, r4, #0 - bl sub_08083658 -_080835C6: - pop {r4, pc} - - thumb_func_start sub_080835C8 -sub_080835C8: @ 0x080835C8 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xb] - cmp r0, #0 - bne _080835E2 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - bne _080835F4 - b _080835F0 -_080835E2: - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _080835F4 -_080835F0: - movs r0, #3 - strb r0, [r4, #0xc] -_080835F4: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_080835F8 -sub_080835F8: @ 0x080835F8 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x39 - ldrb r0, [r0] - lsls r0, r0, #0x18 - asrs r0, r0, #0x18 - cmp r0, #0 - bne _08083616 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _08083636 -_08083616: - movs r0, #1 - strb r0, [r4, #0xc] - movs r0, #0x14 - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl sub_08083658 - adds r0, r4, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl SetFlag - movs r0, #1 - rsbs r0, r0, #0 - bl sub_080526F8 -_08083636: - pop {r4, pc} - - thumb_func_start sub_08083638 -sub_08083638: @ 0x08083638 - adds r2, r0, #0 - movs r0, #7 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x18] - subs r0, #0xb - ands r0, r1 - strb r0, [r2, #0x18] - adds r0, r2, #0 - adds r0, #0x70 - ldrh r0, [r0] - strh r0, [r2, #0x2e] - adds r0, r2, #0 - adds r0, #0x72 - ldrh r0, [r0] - strh r0, [r2, #0x32] - bx lr - - thumb_func_start sub_08083658 -sub_08083658: @ 0x08083658 - push {lr} - movs r1, #1 - strb r1, [r0, #0xc] - movs r1, #0x14 - strb r1, [r0, #0xe] - adds r2, r0, #0 - adds r2, #0x7e - ldrb r1, [r2] - lsls r1, r1, #3 - strb r1, [r0, #0x15] - ldrb r2, [r2] - lsls r2, r2, #1 - ldr r1, _08083698 @ =gUnk_0811F680 - adds r2, r2, r1 - movs r1, #0 - ldrsb r1, [r2, r1] - ldrh r3, [r0, #0x2e] - adds r1, r1, r3 - strh r1, [r0, #0x2e] - movs r1, #1 - ldrsb r1, [r2, r1] - ldrh r2, [r0, #0x32] - adds r1, r1, r2 - strh r1, [r0, #0x32] - movs r1, #0x3c - bl sub_0805E4E0 - ldr r0, _0808369C @ =0x0000010B - bl SoundReq - pop {pc} - .align 2, 0 -_08083698: .4byte gUnk_0811F680 -_0808369C: .4byte 0x0000010B - - thumb_func_start sub_080836A0 -sub_080836A0: @ 0x080836A0 - push {lr} - adds r2, r0, #0 - movs r0, #6 - strb r0, [r2, #0xc] - ldrb r1, [r2, #0x18] - subs r0, #0xa - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] - adds r0, r2, #0 - adds r0, #0x70 - ldrh r0, [r0] - strh r0, [r2, #0x2e] - adds r0, r2, #0 - adds r0, #0x72 - ldrh r0, [r0] - strh r0, [r2, #0x32] - ldr r0, _080836D8 @ =0x00004022 - adds r1, r2, #0 - adds r1, #0x76 - ldrh r1, [r1] - adds r2, #0x38 - ldrb r2, [r2] - bl SetTile - pop {pc} - .align 2, 0 -_080836D8: .4byte 0x00004022 - - thumb_func_start sub_080836DC -sub_080836DC: @ 0x080836DC - push {r4, r5, lr} - adds r5, r0, #0 - adds r4, r1, #0 - adds r1, r2, #0 - ldr r0, _0808372C @ =0x00004022 - adds r2, r5, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl SetTile - movs r0, #7 - strb r0, [r5, #0xe] - ldrb r1, [r5, #0x18] - subs r0, #0xb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r5, #0x18] - lsls r0, r4, #3 - movs r1, #0x10 - eors r0, r1 - strb r0, [r5, #0x15] - lsls r4, r4, #1 - ldr r0, _08083730 @ =gUnk_0811F688 - adds r4, r4, r0 - ldrb r0, [r5, #0xb] - cmp r0, #2 - beq _08083728 - movs r0, #0 - ldrsb r0, [r4, r0] - ldrh r1, [r5, #0x2e] - adds r0, r0, r1 - strh r0, [r5, #0x2e] - movs r0, #1 - ldrsb r0, [r4, r0] - ldrh r1, [r5, #0x32] - adds r0, r0, r1 - strh r0, [r5, #0x32] -_08083728: - pop {r4, r5, pc} - .align 2, 0 -_0808372C: .4byte 0x00004022 -_08083730: .4byte gUnk_0811F688 - - thumb_func_start sub_08083734 -sub_08083734: @ 0x08083734 - push {lr} - adds r2, r0, #0 - cmp r1, #1 - beq _08083760 - cmp r1, #1 - blo _0808374A - cmp r1, #2 - beq _08083774 - cmp r1, #3 - beq _08083790 - b _080837AC -_0808374A: - adds r0, r2, #0 - adds r0, #0x72 - ldrh r1, [r0] - ldr r0, _0808375C @ =gPlayerEntity - movs r2, #0x32 - ldrsh r0, [r0, r2] - subs r0, #0xd - b _0808379E - .align 2, 0 -_0808375C: .4byte gPlayerEntity -_08083760: - ldr r0, _08083770 @ =gPlayerEntity - movs r1, #0x2e - ldrsh r0, [r0, r1] - adds r0, #0xb - adds r1, r2, #0 - adds r1, #0x70 - b _08083780 - .align 2, 0 -_08083770: .4byte gPlayerEntity -_08083774: - ldr r0, _0808378C @ =gPlayerEntity - movs r1, #0x32 - ldrsh r0, [r0, r1] - adds r0, #8 - adds r1, r2, #0 - adds r1, #0x72 -_08083780: - ldrh r1, [r1] - subs r0, r0, r1 - cmp r0, #0 - bge _080837AC - movs r0, #1 - b _080837AE - .align 2, 0 -_0808378C: .4byte gPlayerEntity -_08083790: - adds r0, r2, #0 - adds r0, #0x70 - ldrh r1, [r0] - ldr r0, _080837A8 @ =gPlayerEntity - movs r2, #0x2e - ldrsh r0, [r0, r2] - subs r0, #0xa -_0808379E: - subs r1, r1, r0 - cmp r1, #0 - bge _080837AC - movs r0, #1 - b _080837AE - .align 2, 0 -_080837A8: .4byte gPlayerEntity -_080837AC: - movs r0, #0 -_080837AE: - pop {pc} - - thumb_func_start sub_080837B0 -sub_080837B0: @ 0x080837B0 - push {r4, r5, lr} - adds r4, r0, #0 - ldr r0, _080837C8 @ =gRoomControls - ldrb r2, [r0, #4] - cmp r2, #0x3f - bhi _080837DC - cmp r2, #0x25 - beq _080837CC - cmp r2, #0x35 - beq _080837D4 - movs r5, #0xa - b _080837E8 - .align 2, 0 -_080837C8: .4byte gRoomControls -_080837CC: - ldr r5, _080837D0 @ =0x000001E7 - b _080837E8 - .align 2, 0 -_080837D0: .4byte 0x000001E7 -_080837D4: - ldr r5, _080837D8 @ =0x000001C3 - b _080837E8 - .align 2, 0 -_080837D8: .4byte 0x000001C3 -_080837DC: - ldr r1, _080837F8 @ =gUnk_0811F690 - adds r0, r2, #0 - subs r0, #0x40 - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r5, [r0] -_080837E8: - cmp r2, #0x68 - bne _080837FC - adds r0, r4, #0 - movs r1, #0 - bl sub_0801D2B4 - b _08083808 - .align 2, 0 -_080837F8: .4byte gUnk_0811F690 -_080837FC: - cmp r2, #0x88 - bne _08083808 - adds r0, r4, #0 - movs r1, #1 - bl sub_0801D2B4 -_08083808: - adds r0, r4, #0 - adds r1, r5, #0 - bl LoadFixedGFX - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08083814 -sub_08083814: @ 0x08083814 - push {r4, r5, lr} - adds r5, r0, #0 - lsls r1, r1, #2 - ldr r0, _08083868 @ =gUnk_0811F730 - adds r4, r1, r0 - adds r0, r5, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _08083842 - movs r0, #0 - ldrsb r0, [r4, r0] - ldrh r1, [r2, #0x2e] - adds r0, r0, r1 - strh r0, [r2, #0x2e] - movs r0, #1 - ldrsb r0, [r4, r0] - ldrh r1, [r2, #0x32] - adds r0, r0, r1 - strh r0, [r2, #0x32] -_08083842: - adds r0, r5, #0 - movs r1, #0x11 - movs r2, #0x40 - bl CreateFx - adds r2, r0, #0 - cmp r2, #0 - beq _08083866 - movs r0, #2 - ldrsb r0, [r4, r0] - ldrh r1, [r2, #0x2e] - adds r0, r0, r1 - strh r0, [r2, #0x2e] - movs r0, #3 - ldrsb r0, [r4, r0] - ldrh r1, [r2, #0x32] - adds r0, r0, r1 - strh r0, [r2, #0x32] -_08083866: - pop {r4, r5, pc} - .align 2, 0 -_08083868: .4byte gUnk_0811F730 diff --git a/data/const/object/lockedDoor.s b/data/const/object/lockedDoor.s deleted file mode 100644 index 18f12a60..00000000 --- a/data/const/object/lockedDoor.s +++ /dev/null @@ -1,31 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0811F65C:: @ 0811F65C - .4byte sub_08083338 - .4byte sub_080834B4 - .4byte sub_080834EC - .4byte sub_08083518 - .4byte sub_08083540 - .4byte nullsub_513 - .4byte sub_08083598 - .4byte sub_080835C8 - .4byte sub_080835F8 - -gUnk_0811F680:: @ 0811F680 - .incbin "baserom.gba", 0x11F680, 0x0000008 - -gUnk_0811F688:: @ 0811F688 - .incbin "baserom.gba", 0x11F688, 0x0000008 - -gUnk_0811F690:: @ 0811F690 - .incbin "baserom.gba", 0x11F690, 0x00000A0 - -gUnk_0811F730:: @ 0811F730 - .incbin "baserom.gba", 0x11F730, 0x0000010 - -gUnk_0811F740:: @ 0811F740 - .incbin "baserom.gba", 0x11F740, 0x0000004 diff --git a/linker.ld b/linker.ld index 638f9b5e..fcf63a1a 100644 --- a/linker.ld +++ b/linker.ld @@ -709,7 +709,7 @@ SECTIONS { src/object/pot.o(.text); asm/object6.o(.text); asm/blockPushed.o(.text); - asm/lockedDoor.o(.text); + src/object/lockedDoor.o(.text); asm/object9.o(.text); src/object/objectA.o(.text); asm/objectB.o(.text); @@ -1414,7 +1414,7 @@ SECTIONS { data/const/object/object6.o(.rodata); data/animations/object/object6.o(.rodata); data/const/object/blockPushed.o(.rodata); - data/const/object/lockedDoor.o(.rodata); + src/object/lockedDoor.o(.rodata); data/const/object/object9.o(.rodata); data/animations/object/object9.o(.rodata); data/const/object/objectB.o(.rodata); diff --git a/src/object/lockedDoor.c b/src/object/lockedDoor.c new file mode 100644 index 00000000..f7918284 --- /dev/null +++ b/src/object/lockedDoor.c @@ -0,0 +1,328 @@ +#include "global.h" +#include "entity.h" +#include "flags.h" +#include "game.h" +#include "audio.h" +#include "functions.h" + +void sub_08083338(Entity*); +void sub_080834B4(Entity*); +void sub_080834EC(Entity*); +void sub_08083518(Entity*); +void sub_08083540(Entity*); +void nullsub_513(Entity*); +void sub_08083598(Entity*); +void sub_080835C8(Entity*); +void sub_080835F8(Entity*); + +void sub_08083638(Entity*); +void sub_08083658(Entity*); +void sub_080836A0(Entity*); +void sub_080836DC(Entity*, u32, u32); +u32 sub_08083734(Entity*, u32); +u32 sub_080837B0(Entity*); +void sub_08083814(Entity*, u32); + +void (*const gUnk_0811F65C[])(Entity*) = { + sub_08083338, sub_080834B4, sub_080834EC, sub_08083518, sub_08083540, + nullsub_513, sub_08083598, sub_080835C8, sub_080835F8, +}; + +void LockedDoor(Entity* this) { + gUnk_0811F65C[this->action](this); +} + +extern Hitbox gUnk_080FD170; + +extern u32 sub_080001DA(u32, u32); +extern void sub_08078850(Entity*, u32, u32, u32); +extern void sub_0805E4E0(Entity*, u32); + +typedef struct PACKED { + s8 x; + s8 y; +} struct_0811F680; + +const struct_0811F680 gUnk_0811F680[] = { + { 0, -2 }, + { 2, 0 }, + { 0, 2 }, + { -2, 0 }, +}; + +const struct_0811F680 gUnk_0811F688[] = { + { 0, -21 }, + { 21, 0 }, + { 0, 21 }, + { -21, 0 }, +}; + +const u16 gUnk_0811F690[] = { + 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, + 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, + 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x54, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, + 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, 0x57, + 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x58, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, 0x59, +}; + +typedef struct { + struct_0811F680 unk_00; + struct_0811F680 unk_02; +} struct_0811F730; + +const struct_0811F730 gUnk_0811F730[] = { + { { 8, 8 }, { -8, 8 } }, + { { -8, 8 }, { -8, -8 } }, + { { 8, -8 }, { -8, -8 } }, + { { 8, 8 }, { 8, -8 } }, +}; + +const u8 gUnk_0811F740[] = { + 0xBE, + 0x7D, + 0xEB, + 0xD7, +}; + +void sub_08083338(Entity* this) { + if (this->cutsceneBeh.HWORD != 0xFFFF && CheckFlags(this->cutsceneBeh.HWORD)) { + DeleteThisEntity(); + } + if (!sub_080837B0(this)) + return; + this->type2 = (this->type >> 2) & 3; + this->frameIndex = this->type & 3; + this->speed = 0x300; + this->field_0x70.HALF.LO = this->x.HALF.HI; + this->field_0x70.HALF.HI = this->y.HALF.HI; + this->field_0x7c.BYTES.byte2 = this->type & 3; + this->hitbox = &gUnk_080FD170; + this->spritePriority.b0 = 5; + this->frames.all = this->type & 0xF; + this->field_0x76.HWORD = TILE(this->x.HALF.HI, this->y.HALF.HI); + this->field_0x74.HWORD = sub_080001DA(this->field_0x76.HWORD, this->collisionLayer); + switch (this->type2) { + case 0: + if (!CheckFlags(this->field_0x86.HWORD)) { + if (this->type & 0x10) { + this->action = 3; + } else { + sub_080836A0(this); + } + } else { + this->type &= ~0x10; + sub_08083638(this); + } + break; + case 1: + if (!CheckFlags(this->field_0x86.HWORD)) { + sub_08083638(this); + } else { + sub_080836A0(this); + } + break; + case 2: + if (!CheckFlags(this->field_0x86.HWORD)) { + this->frameIndex |= 4; + sub_080836DC(this, this->field_0x7c.BYTES.byte2, this->field_0x76.HWORD); + if (!CheckIsDungeon()) { + this->action = 5; + } else { + this->action = 8; + sub_080787CC(this); + sub_08078850(this, 0, gUnk_0811F740[this->field_0x7c.BYTES.byte2], 0); + } + } else { + DeleteThisEntity(); + } + break; + default: + DeleteThisEntity(); + break; + } +} + +void sub_080834B4(Entity* this) { + if (--this->actionDelay == 0) { + this->action = 2; + this->actionDelay = 7; + SetTile(this->field_0x74.HWORD, this->field_0x76.HWORD, this->collisionLayer); + EnqueueSFX(0x10b); + } +} + +void sub_080834EC(Entity* this) { + sub_0806F69C(this); + if (--this->actionDelay == 0) { + if (this->type & 0x80) { + sub_08083638(this); + } else { + DeleteThisEntity(); + } + } +} + +void sub_08083518(Entity* this) { + if (sub_08083734(this, this->field_0x7c.BYTES.byte2)) { + this->action = 4; + sub_080836DC(this, this->field_0x7c.BYTES.byte2, this->field_0x76.HWORD); + } +} + +void sub_08083540(Entity* this) { + sub_0806F69C(this); + if (!--this->actionDelay) { + if (this->type & 0x10) { + this->type &= ~0x10; + sub_080836A0(this); + } else { + if (this->type & 0x80) { + sub_080836A0(this); + } else { + this->action = 5; + } + } + sub_08083814(this, this->field_0x7c.BYTES.byte2); + EnqueueSFX(0x10b); + } +} + +void nullsub_513(Entity* this) { +} + +void sub_08083598(Entity* this) { + if (this->type2 == 0) { + if (!CheckFlags(this->field_0x86.HWORD)) + return; + } else { + if (CheckFlags(this->field_0x86.HWORD)) + return; + } + sub_08083658(this); +} + +void sub_080835C8(Entity* this) { + if (this->type2 == 0) { + if (CheckFlags(this->field_0x86.HWORD)) + return; + } else { + if (!CheckFlags(this->field_0x86.HWORD)) + return; + } + this->action = 3; +} + +void sub_080835F8(Entity* this) { + if (this->interactType == 0 && !CheckFlags(this->field_0x86.HWORD)) + return; + this->action = 1; + this->actionDelay = 0x14; + sub_08083658(this); + SetFlag(this->field_0x86.HWORD); + sub_080526F8(-1); +} + +void sub_08083638(Entity* this) { + this->action = 7; + this->spriteSettings.b.draw = 0; + this->x.HALF.HI = this->field_0x70.HALF.LO; + this->y.HALF.HI = this->field_0x70.HALF.HI; +} + +void sub_08083658(Entity* this) { + const struct_0811F680* tmp; + this->action = 1; + this->actionDelay = 0x14; + this->direction = this->field_0x7c.BYTES.byte2 << 3; + tmp = &gUnk_0811F680[this->field_0x7c.BYTES.byte2]; + this->x.HALF.HI += tmp->x; + this->y.HALF.HI += tmp->y; + sub_0805E4E0(this, 0x3c); + SoundReq(0x10b); +} + +void sub_080836A0(Entity* this) { + this->action = 6; + this->spriteSettings.b.draw = 1; + this->x.HALF.HI = this->field_0x70.HALF.LO; + this->y.HALF.HI = this->field_0x70.HALF.HI; + SetTile(0x4022, this->field_0x76.HWORD, this->collisionLayer); +} + +void sub_080836DC(Entity* this, u32 unk_0, u32 unk_1) { + const struct_0811F680* tmp; + SetTile(0x4022, unk_1, this->collisionLayer); + this->actionDelay = 7; + this->spriteSettings.b.draw = 1; + this->direction = (unk_0 << 3) ^ 0x10; + tmp = &gUnk_0811F688[unk_0]; + if (this->type2 != 2) { + this->x.HALF.HI += tmp->x; + this->y.HALF.HI += tmp->y; + } +} + +u32 sub_08083734(Entity* this, u32 unk0) { + switch (unk0) { + case 0: + if (this->field_0x70.HALF_U.HI + 0xd - gPlayerEntity.y.HALF.HI < 0) + return 1; + break; + case 1: + if (gPlayerEntity.x.HALF.HI - (this->field_0x70.HALF_U.LO - 0xb) < 0) + return 1; + break; + case 2: + if (gPlayerEntity.y.HALF.HI - (this->field_0x70.HALF_U.HI - 0x8) < 0) + return 1; + break; + case 3: + if (this->field_0x70.HALF_U.LO + 0xa - gPlayerEntity.x.HALF.HI < 0) + return 1; + break; + } + return 0; +} + +u32 sub_080837B0(Entity* this) { + u32 tmp; + u32 tmp2 = gRoomControls.areaID; + if (tmp2 < 0x40) { + switch (tmp2) { + default: + tmp = 0xA; + break; + case 0x25: + tmp = 0x1e7; + break; + case 0x35: + tmp = 0x1c3; + break; + } + } else { + tmp = gUnk_0811F690[tmp2 - 0x40]; + } + if (tmp2 == 0x68) { + sub_0801D2B4(this, 0); + } else { + if (tmp2 == 0x88) { + sub_0801D2B4(this, 1); + } + } + LoadFixedGFX(this, tmp); +} + +void sub_08083814(Entity* this, u32 unk0) { + Entity* fx; + const struct_0811F730* tmp = &gUnk_0811F730[unk0]; + fx = CreateFx(this, 0x11, 0x40); + if (fx) { + fx->x.HALF.HI += tmp->unk_00.x; + fx->y.HALF.HI += tmp->unk_00.y; + } + fx = CreateFx(this, 0x11, 0x40); + if (fx) { + fx->x.HALF.HI += tmp->unk_02.x; + fx->y.HALF.HI += tmp->unk_02.y; + } +}