diff --git a/asm/object/objectBlockingStairs.s b/asm/object/objectBlockingStairs.s deleted file mode 100644 index bfe2cb30..00000000 --- a/asm/object/objectBlockingStairs.s +++ /dev/null @@ -1,677 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start ObjectBlockingStairs -ObjectBlockingStairs: @ 0x08092ED4 - push {lr} - ldr r2, _08092EE8 @ =gUnk_0812283C - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_08092EE8: .4byte gUnk_0812283C - - thumb_func_start sub_08092EEC -sub_08092EEC: @ 0x08092EEC - push {r4, r5, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xa] - bl sub_080932D8 - cmp r0, #1 - beq _08092F2C - cmp r0, #2 - beq _08092F3A - movs r0, #1 - strb r0, [r4, #0xc] - movs r1, #0 - movs r2, #0x80 - strh r2, [r4, #0x24] - strb r0, [r4, #0x16] - strb r1, [r4, #0xe] - strb r1, [r4, #0xf] - adds r1, r4, #0 - adds r1, #0x7a - movs r0, #0x20 - strb r0, [r1] - adds r0, r4, #0 - adds r0, #0x7b - strb r2, [r0] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08092F48 - ldr r0, _08092F28 @ =gUnk_080FD288 - str r0, [r4, #0x48] - b _08092F48 - .align 2, 0 -_08092F28: .4byte gUnk_080FD288 -_08092F2C: - movs r0, #4 - strb r0, [r4, #0xc] - ldrh r0, [r4, #0x2e] - subs r0, #0x20 - strh r0, [r4, #0x2e] - movs r5, #2 - b _08092F5E -_08092F3A: - movs r0, #4 - strb r0, [r4, #0xc] - ldrh r0, [r4, #0x2e] - adds r0, #0x20 - strh r0, [r4, #0x2e] - movs r5, #3 - b _08092F5E -_08092F48: - movs r5, #0 - adds r1, r4, #0 - adds r1, #0x86 - ldrh r0, [r1] - cmp r0, #0 - beq _08092F5E - bl CheckFlags - cmp r0, #0 - bne _08092F5E - movs r5, #1 -_08092F5E: - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_080931A4 - pop {r4, r5, pc} - - thumb_func_start sub_08092F68 -sub_08092F68: @ 0x08092F68 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r6, r0, #0 - ldr r0, _08092FA4 @ =gPlayerEntity - movs r2, #0x2e - ldrsh r1, [r0, r2] - movs r2, #0x2e - ldrsh r0, [r6, r2] - subs r1, r1, r0 - mov r8, r1 - adds r1, r6, #0 - adds r1, #0x86 - ldrh r0, [r1] - cmp r0, #0 - beq _08092FA8 - bl CheckFlags - cmp r0, #0 - bne _08092F92 - b _080930E6 -_08092F92: - adds r0, r6, #0 - adds r0, #0x7a - ldrb r0, [r0] - cmp r0, #0 - beq _08092FA8 - adds r0, r6, #0 - bl sub_080932A8 - b _080930E6 - .align 2, 0 -_08092FA4: .4byte gPlayerEntity -_08092FA8: - adds r1, r6, #0 - adds r1, #0x7b - ldrb r2, [r1] - movs r0, #0x3f - ands r0, r2 - adds r7, r1, #0 - cmp r0, #0 - bne _08092FD6 - movs r0, #0xf - movs r4, #0 - orrs r0, r2 - strb r0, [r7] - adds r0, r6, #0 - movs r1, #0 - bl sub_080931A4 - mov r0, r8 - cmp r0, #0 - bge _08092FD6 - ldrb r0, [r7] - movs r1, #0x40 - orrs r0, r1 - strb r0, [r7] -_08092FD6: - ldrb r1, [r7] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _08092FEA - adds r5, r6, #0 - adds r5, #0x78 - ldrh r0, [r5] - subs r0, #1 - b _08092FF2 -_08092FEA: - adds r5, r6, #0 - adds r5, #0x78 - ldrh r0, [r5] - adds r0, #1 -_08092FF2: - adds r4, r6, #0 - adds r4, #0x38 - ldrb r1, [r4] - bl GetTileType - adds r1, r0, #0 - ldr r0, _08093034 @ =0x00004031 - cmp r1, r0 - bhi _08093040 - subs r0, #1 - cmp r1, r0 - blo _08093040 - movs r0, #3 - strb r0, [r6, #0xc] - ldr r0, _08093038 @ =gPlayerEntity - ldrb r0, [r0, #0x14] - lsls r0, r0, #2 - strb r0, [r6, #0x15] - movs r0, #0x80 - strh r0, [r6, #0x24] - movs r0, #0x40 - strb r0, [r6, #0xe] - adds r0, r6, #0 - movs r1, #0x50 - bl RequestPriorityDuration - ldr r0, _0809303C @ =0x0000010F - bl EnqueueSFX - adds r0, r6, #0 - bl sub_08093248 - b _080930E6 - .align 2, 0 -_08093034: .4byte 0x00004031 -_08093038: .4byte gPlayerEntity -_0809303C: .4byte 0x0000010F -_08093040: - ldr r0, _0809307C @ =gPlayerEntity - ldrb r1, [r0, #0x14] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _080930E6 - adds r0, r6, #0 - bl RegisterCarryEntity - adds r3, r7, #0 - ldrb r2, [r3] - movs r0, #0x80 - ands r0, r2 - cmp r0, #0 - beq _08093088 - movs r1, #0x7f - ands r1, r2 - strb r1, [r3] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _0809309C - ldr r0, _08093080 @ =0x0000402C - ldrh r1, [r5] - subs r1, #1 - ldrb r2, [r4] - bl SetTile - ldr r0, _08093084 @ =0x0000403D - b _080930AA - .align 2, 0 -_0809307C: .4byte gPlayerEntity -_08093080: .4byte 0x0000402C -_08093084: .4byte 0x0000403D -_08093088: - movs r0, #0x40 - ands r0, r2 - cmp r0, #0 - beq _080930C0 - mov r1, r8 - cmp r1, #4 - ble _080930E6 - movs r0, #0x3f - ands r0, r2 - strb r0, [r3] -_0809309C: - ldr r0, _080930B8 @ =0x0000403D - ldrh r1, [r5] - subs r1, #1 - ldrb r2, [r4] - bl SetTile - ldr r0, _080930BC @ =0x0000402D -_080930AA: - ldrh r1, [r5] - adds r1, #1 - ldrb r2, [r4] - bl SetTile - b _080930E6 - .align 2, 0 -_080930B8: .4byte 0x0000403D -_080930BC: .4byte 0x0000402D -_080930C0: - mov r1, r8 - rsbs r0, r1, #0 - cmp r0, #4 - ble _080930E6 - movs r0, #0x40 - orrs r0, r2 - strb r0, [r7] - ldr r0, _080930EC @ =0x0000402C - ldrh r1, [r5] - subs r1, #1 - ldrb r2, [r4] - bl SetTile - ldr r0, _080930F0 @ =0x0000403D - ldrh r1, [r5] - adds r1, #1 - ldrb r2, [r4] - bl SetTile -_080930E6: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080930EC: .4byte 0x0000402C -_080930F0: .4byte 0x0000403D - - thumb_func_start sub_080930F4 -sub_080930F4: @ 0x080930F4 - push {r4, r5, r6, lr} - adds r4, r0, #0 - ldrb r3, [r4, #0xe] - cmp r3, #0 - beq _08093104 - bl sub_08093280 - b _08093174 -_08093104: - ldr r5, _0809315C @ =gPlayerState - ldrb r0, [r5, #5] - cmp r0, #0x12 - bne _08093168 - ldr r6, _08093160 @ =gPlayerEntity - adds r0, r6, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #2 - ands r0, r1 - cmp r0, #0 - beq _08093174 - ldrb r0, [r4, #0xf] - adds r0, #1 - strb r0, [r4, #0xf] - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #8 - bls _08093174 - movs r0, #0x10 - strb r0, [r5, #0xc] - adds r0, r5, #0 - adds r0, #0x38 - movs r2, #0x40 - strb r2, [r0] - ldr r0, [r5, #0x30] - movs r1, #1 - orrs r0, r1 - str r0, [r5, #0x30] - strh r3, [r6, #0x2c] - strh r3, [r6, #0x30] - ldrb r0, [r6, #0x14] - movs r1, #4 - eors r0, r1 - lsls r0, r0, #2 - strb r0, [r4, #0x15] - strb r2, [r4, #0xe] - ldr r0, _08093164 @ =0x0000010F - bl EnqueueSFX - adds r0, r4, #0 - bl sub_08093248 - b _08093174 - .align 2, 0 -_0809315C: .4byte gPlayerState -_08093160: .4byte gPlayerEntity -_08093164: .4byte 0x0000010F -_08093168: - ldrb r0, [r4, #0xd] - cmp r0, #6 - bne _08093174 - movs r0, #1 - strb r0, [r4, #0xc] - strb r3, [r4, #0xf] -_08093174: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_08093178 -sub_08093178: @ 0x08093178 - push {r4, lr} - adds r4, r0, #0 - bl sub_0800445C - adds r0, r4, #0 - bl LinearMoveUpdate - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _08093198 - adds r0, r4, #0 - bl sub_08093334 -_08093198: - adds r0, r4, #0 - bl sub_08093364 - pop {r4, pc} - - thumb_func_start nullsub_120 -nullsub_120: @ 0x080931A0 - bx lr - .align 2, 0 - - thumb_func_start sub_080931A4 -sub_080931A4: @ 0x080931A4 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r1, #0 - movs r1, #0x2e - ldrsh r2, [r0, r1] - ldr r3, _080931F0 @ =gRoomControls - ldrh r1, [r3, #6] - subs r2, r2, r1 - asrs r2, r2, #4 - movs r4, #0x3f - ands r2, r4 - movs r6, #0x32 - ldrsh r1, [r0, r6] - ldrh r3, [r3, #8] - subs r1, r1, r3 - asrs r1, r1, #4 - ands r1, r4 - lsls r1, r1, #6 - orrs r2, r1 - adds r1, r0, #0 - adds r1, #0x78 - strh r2, [r1] - ldrh r1, [r1] - subs r1, #0x40 - mov r8, r1 - adds r0, #0x38 - ldrb r7, [r0] - cmp r5, #1 - beq _080931F4 - cmp r5, #1 - blo _0809320C - cmp r5, #2 - beq _080931FC - cmp r5, #3 - beq _08093204 - b _0809320C - .align 2, 0 -_080931F0: .4byte gRoomControls -_080931F4: - ldr r0, _080931F8 @ =gUnk_08122862 - b _0809320E - .align 2, 0 -_080931F8: .4byte gUnk_08122862 -_080931FC: - ldr r0, _08093200 @ =gUnk_08122874 - b _0809320E - .align 2, 0 -_08093200: .4byte gUnk_08122874 -_08093204: - ldr r0, _08093208 @ =gUnk_08122886 - b _0809320E - .align 2, 0 -_08093208: .4byte gUnk_08122886 -_0809320C: - ldr r0, _08093230 @ =gUnk_08122850 -_0809320E: - movs r4, #0 - movs r6, #0 - adds r5, r0, #0 -_08093214: - mov r0, r8 - adds r1, r0, r6 - adds r1, r1, r4 - subs r1, #1 - ldrh r0, [r5] - adds r2, r7, #0 - bl SetTile - cmp r4, #2 - beq _08093234 - cmp r4, #5 - beq _08093238 - b _0809323A - .align 2, 0 -_08093230: .4byte gUnk_08122850 -_08093234: - movs r6, #0x3d - b _0809323A -_08093238: - movs r6, #0x7a -_0809323A: - adds r5, #2 - adds r4, #1 - cmp r4, #8 - bls _08093214 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_08093248 -sub_08093248: @ 0x08093248 - push {r4, r5, r6, r7, lr} - adds r1, r0, #0 - adds r1, #0x78 - ldrh r1, [r1] - adds r7, r1, #0 - subs r7, #0x40 - adds r0, #0x38 - ldrb r6, [r0] - movs r4, #0 - movs r5, #0 -_0809325C: - adds r0, r7, r5 - adds r0, r0, r4 - subs r0, #1 - adds r1, r6, #0 - bl sub_0807BA8C - cmp r4, #2 - beq _08093272 - cmp r4, #5 - beq _08093276 - b _08093278 -_08093272: - movs r5, #0x3d - b _08093278 -_08093276: - movs r5, #0x7a -_08093278: - adds r4, #1 - cmp r4, #8 - bls _0809325C - pop {r4, r5, r6, r7, pc} - - thumb_func_start sub_08093280 -sub_08093280: @ 0x08093280 - push {r4, lr} - adds r4, r0, #0 - bl sub_0800445C - adds r0, r4, #0 - bl LinearMoveUpdate - ldrb r0, [r4, #0xe] - subs r0, #1 - strb r0, [r4, #0xe] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _080932A0 - adds r0, r4, #0 - bl sub_08093334 -_080932A0: - adds r0, r4, #0 - bl sub_08093364 - pop {r4, pc} - - thumb_func_start sub_080932A8 -sub_080932A8: @ 0x080932A8 - push {lr} - adds r1, r0, #0 - adds r2, r1, #0 - adds r2, #0x7a - ldrb r0, [r2] - subs r0, #1 - strb r0, [r2] - movs r2, #3 - ands r2, r0 - cmp r2, #1 - beq _080932C8 - cmp r2, #3 - beq _080932D0 - adds r1, #0x62 - movs r0, #0 - b _080932D4 -_080932C8: - adds r0, r1, #0 - adds r0, #0x62 - strb r2, [r0] - b _080932D6 -_080932D0: - adds r1, #0x62 - movs r0, #0xff -_080932D4: - strb r0, [r1] -_080932D6: - pop {pc} - - thumb_func_start sub_080932D8 -sub_080932D8: @ 0x080932D8 - push {r4, lr} - lsls r0, r0, #3 - ldr r1, _080932F0 @ =gUnk_08122898 - adds r4, r0, r1 - ldr r0, [r4] - ldrh r1, [r4, #4] - bl CheckLocalFlagByBank - cmp r0, #0 - beq _080932F4 - movs r0, #1 - b _08093306 - .align 2, 0 -_080932F0: .4byte gUnk_08122898 -_080932F4: - ldr r0, [r4] - ldrh r1, [r4, #6] - bl CheckLocalFlagByBank - cmp r0, #0 - bne _08093304 - movs r0, #0 - b _08093306 -_08093304: - movs r0, #2 -_08093306: - pop {r4, pc} - - thumb_func_start sub_08093308 -sub_08093308: @ 0x08093308 - push {lr} - adds r2, r1, #0 - lsls r0, r0, #3 - ldr r1, _08093320 @ =gUnk_08122898 - adds r1, r0, r1 - cmp r2, #1 - bne _08093324 - ldr r0, [r1] - ldrh r1, [r1, #4] - bl SetLocalFlagByBank - b _08093330 - .align 2, 0 -_08093320: .4byte gUnk_08122898 -_08093324: - cmp r2, #2 - bne _08093330 - ldr r0, [r1] - ldrh r1, [r1, #6] - bl SetLocalFlagByBank -_08093330: - pop {pc} - .align 2, 0 - - thumb_func_start sub_08093334 -sub_08093334: @ 0x08093334 - push {r4, r5, lr} - adds r4, r0, #0 - movs r0, #4 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x15] - movs r0, #0x10 - ands r0, r1 - movs r5, #2 - cmp r0, #0 - beq _0809334A - movs r5, #1 -_0809334A: - adds r1, r5, #1 - adds r0, r4, #0 - bl sub_080931A4 - ldrb r0, [r4, #0xa] - adds r1, r5, #0 - bl sub_08093308 - movs r0, #0x72 - bl EnqueueSFX - pop {r4, r5, pc} - .align 2, 0 - - thumb_func_start sub_08093364 -sub_08093364: @ 0x08093364 - push {r4, r5, lr} - adds r5, r0, #0 - ldrb r1, [r5, #0xe] - movs r0, #3 - ands r0, r1 - cmp r0, #0 - bne _080933BC - movs r0, #0xf - movs r1, #0x11 - movs r2, #0 - bl CreateObject - adds r4, r0, #0 - cmp r4, #0 - beq _080933BC - str r5, [r4, #0x50] - adds r0, r5, #0 - adds r1, r4, #0 - bl CopyPosition - ldrb r1, [r5, #0x15] - movs r0, #0x10 - ands r0, r1 - cmp r0, #0 - beq _0809339C - ldrh r0, [r4, #0x2e] - adds r0, #0x12 - b _080933A0 -_0809339C: - ldrh r0, [r4, #0x2e] - subs r0, #0x12 -_080933A0: - strh r0, [r4, #0x2e] - movs r0, #0x32 - ldrsh r2, [r4, r0] - ldrb r1, [r5, #0xe] - movs r0, #8 - ands r0, r1 - cmp r0, #0 - beq _080933B6 - adds r0, r2, #0 - adds r0, #8 - b _080933BA -_080933B6: - adds r0, r2, #0 - subs r0, #8 -_080933BA: - strh r0, [r4, #0x32] -_080933BC: - pop {r4, r5, pc} - .align 2, 0 diff --git a/assets/assets.json b/assets/assets.json index b4fea800..cb8e9a93 100644 --- a/assets/assets.json +++ b/assets/assets.json @@ -43906,31 +43906,6 @@ "size": 27, "type": "animation" }, - { - "path": "objectBlockingStairs/gUnk_08122850.bin", - "start": 1189968, - "size": 18 - }, - { - "path": "objectBlockingStairs/gUnk_08122862.bin", - "start": 1189986, - "size": 18 - }, - { - "path": "objectBlockingStairs/gUnk_08122874.bin", - "start": 1190004, - "size": 18 - }, - { - "path": "objectBlockingStairs/gUnk_08122886.bin", - "start": 1190022, - "size": 18 - }, - { - "path": "objectBlockingStairs/gUnk_08122898.bin", - "start": 1190040, - "size": 16 - }, { "path": "swordsmanNewsletter/gUnk_081228A8.bin", "start": 1190056, diff --git a/data/const/object/objectBlockingStairs.s b/data/const/object/objectBlockingStairs.s deleted file mode 100644 index a68959bf..00000000 --- a/data/const/object/objectBlockingStairs.s +++ /dev/null @@ -1,27 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_0812283C:: @ 0812283C - .4byte sub_08092EEC - .4byte sub_08092F68 - .4byte sub_080930F4 - .4byte sub_08093178 - .4byte nullsub_120 - -gUnk_08122850:: @ 08122850 - .incbin "objectBlockingStairs/gUnk_08122850.bin" - -gUnk_08122862:: @ 08122862 - .incbin "objectBlockingStairs/gUnk_08122862.bin" - -gUnk_08122874:: @ 08122874 - .incbin "objectBlockingStairs/gUnk_08122874.bin" - -gUnk_08122886:: @ 08122886 - .incbin "objectBlockingStairs/gUnk_08122886.bin" - -gUnk_08122898:: @ 08122898 - .incbin "objectBlockingStairs/gUnk_08122898.bin" diff --git a/linker.ld b/linker.ld index e24e01ae..88e6fae6 100644 --- a/linker.ld +++ b/linker.ld @@ -721,7 +721,7 @@ SECTIONS { src/object/mask.o(.text); src/object/houseDoorInterior.o(.text); src/object/whirlwind.o(.text); - asm/object/objectBlockingStairs.o(.text); + src/object/objectBlockingStairs.o(.text); src/object/swordsmanNewsletter.o(.text); src/object/object61.o(.text); src/object/giantTwig.o(.text); @@ -1461,7 +1461,7 @@ SECTIONS { src/object/houseDoorInterior.o(.rodata); src/object/whirlwind.o(.rodata); data/animations/object/whirlwind.o(.rodata); - data/const/object/objectBlockingStairs.o(.rodata); + src/object/objectBlockingStairs.o(.rodata); data/const/object/swordsmanNewsletter.o(.rodata); src/object/object61.o(.rodata); src/object/giantTwig.o(.rodata); diff --git a/src/object/objectBlockingStairs.c b/src/object/objectBlockingStairs.c new file mode 100644 index 00000000..f9aa6a1b --- /dev/null +++ b/src/object/objectBlockingStairs.c @@ -0,0 +1,350 @@ +#define NENT_DEPRECATED +#include "entity.h" +#include "flags.h" +#include "sound.h" +#include "functions.h" +#include "asm.h" +#include "object.h" +#include "effects.h" + +typedef struct { + Entity base; + u8 filler[0x10]; + u16 tilePos; + u8 unk7a; + u8 unk7b; + u8 filler2[0xA]; + u16 objFlags; +} ObjectBlockingStairsEntity; + +extern const Hitbox gUnk_080FD288; + +void ObjectBlockingStairs_Init(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action1(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action2(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action3(ObjectBlockingStairsEntity*); +void sub_080932A8(ObjectBlockingStairsEntity*); +void sub_08093248(ObjectBlockingStairsEntity*); +void sub_08093280(ObjectBlockingStairsEntity*); +void sub_08093334(ObjectBlockingStairsEntity*); +void sub_08093364(ObjectBlockingStairsEntity*); +void ObjectBlockingStairs_Action4(ObjectBlockingStairsEntity*); +u32 sub_080932D8(u32); +void sub_080931A4(ObjectBlockingStairsEntity*, u32); + +void ObjectBlockingStairs(Entity* this) { + static void (*const actionFuncs[])(ObjectBlockingStairsEntity*) = { + ObjectBlockingStairs_Init, ObjectBlockingStairs_Action1, ObjectBlockingStairs_Action2, + ObjectBlockingStairs_Action3, ObjectBlockingStairs_Action4, + }; + + actionFuncs[this->action]((ObjectBlockingStairsEntity*)this); +} + +void ObjectBlockingStairs_Init(ObjectBlockingStairsEntity* this) { + int iVar1; + u32 uVar2; + + switch (sub_080932D8(super->type)) { + case 1: + super->action = 4; + super->x.HALF.HI -= 0x20; + uVar2 = 2; + break; + case 2: + super->action = 4; + super->x.HALF.HI += 0x20; + uVar2 = 3; + break; + default: + super->action = 1; + super->speed = 0x80; + super->field_0x16 = 1; + super->actionDelay = 0; + super->field_0xf = 0; + this->unk7a = 0x20; + this->unk7b = 0x80; + if (super->type == 0) { + super->hitbox = (Hitbox*)&gUnk_080FD288; + } + uVar2 = 0; + if ((this->objFlags) && !CheckFlags(this->objFlags)) { + uVar2 = 1; + } + break; + } + + sub_080931A4(this, uVar2); +} + +void ObjectBlockingStairs_Action1(ObjectBlockingStairsEntity* this) { + u32 tileType; + int xDist; + Entity* ent; + + xDist = (int)gPlayerEntity.x.HALF.HI - super->x.HALF.HI; + + if (this->objFlags) { + if (!CheckFlags(this->objFlags)) { + return; + } + if (this->unk7a != 0) { + sub_080932A8(this); + return; + } + } + + if ((this->unk7b & 0x3f) == 0) { + this->unk7b |= 0xf; + sub_080931A4(this, 0); + if (xDist < 0) { + this->unk7b |= 0x40; + } + } + + if (this->unk7b & 0x40) { + tileType = (u32)GetTileType(this->tilePos - 1, super->collisionLayer); + } else { + tileType = (u32)GetTileType(this->tilePos + 1, super->collisionLayer); + } + + switch (tileType) { + case 0x4030: + case 0x4031: + super->action = 3; + super->direction = Direction8FromAnimationState(gPlayerEntity.animationState); + super->speed = 0x80; + super->actionDelay = 0x40; + RequestPriorityDuration(super, 0x50); + EnqueueSFX(SFX_10F); + sub_08093248(this); + return; + } + + if ((gPlayerEntity.animationState & 2) == 0) { + return; + } + RegisterCarryEntity(super); + + if (this->unk7b & 0x80) { + this->unk7b &= ~0x80; + if ((this->unk7b & 0x40) != 0) { + SetTile(0x402c, this->tilePos - 1, super->collisionLayer); + SetTile(0x403d, this->tilePos + 1, super->collisionLayer); + } else { + SetTile(0x403d, this->tilePos - 1, super->collisionLayer); + SetTile(0x402d, this->tilePos + 1, super->collisionLayer); + } + } else if (this->unk7b & 0x40) { + if (xDist >= 5) { + this->unk7b &= ~(0x40 | 0x80); + SetTile(0x403d, this->tilePos - 1, super->collisionLayer); + SetTile(0x402d, this->tilePos + 1, super->collisionLayer); + } + } else { + if (-xDist > 4) { + this->unk7b |= 0x40; + SetTile(0x402c, this->tilePos - 1, super->collisionLayer); + SetTile(0x403d, this->tilePos + 1, super->collisionLayer); + } + } +} + +void ObjectBlockingStairs_Action2(ObjectBlockingStairsEntity* this) { + if (super->actionDelay) { + sub_08093280(this); + } else { + if (gPlayerState.heldObject == 0x12) { + if ((gPlayerEntity.frame & 2) != 0 && ++super->field_0xf > 8) { + gPlayerState.queued_action = 16; + gPlayerState.field_0x38 = 0x40; + gPlayerState.flags |= PL_BUSY; + gPlayerEntity.x.HALF.LO = 0; + gPlayerEntity.y.HALF.LO = 0; + super->direction = (gPlayerEntity.animationState ^ 4) << 2; + super->actionDelay = 0x40; + EnqueueSFX(SFX_10F); + sub_08093248(this); + } + } else if (super->subAction == 6) { + super->action = 1; + super->field_0xf = 0; + } + } +} + +void ObjectBlockingStairs_Action3(ObjectBlockingStairsEntity* this) { + sub_0800445C(super); + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + sub_08093334(this); + } + sub_08093364(this); +} + +void ObjectBlockingStairs_Action4(ObjectBlockingStairsEntity* this) { +} + +void sub_080931A4(ObjectBlockingStairsEntity* this, u32 param_2) { + static const u16 gUnk_08122850[] = { 0x4027, 0x4023, 0x4028, 0x402c, 0x402b, 0x402d, 0x4029, 0x4026, 0x402a }; + static const u16 gUnk_08122862[] = { 0x4027, 0x4023, 0x4028, 0x4024, 0x4022, 0x4025, 0x4029, 0x4026, 0x402a }; + static const u16 gUnk_08122874[] = { 0x4027, 0x4023, 0x4023, 0x4024, 0x4022, 0x4022, 0x4029, 0x4026, 0x4026 }; + static const u16 gUnk_08122886[] = { 0x4023, 0x4023, 0x4028, 0x4022, 0x4022, 0x4025, 0x4026, 0x4026, 0x402a }; + + u32 collisionLayer; + const u16* pTileTypes; + u32 index; + u32 tilePos; + int iVar5; + + this->tilePos = COORD_TO_TILE(super); + tilePos = this->tilePos - 0x40; + collisionLayer = super->collisionLayer; + + switch (param_2) { + case 1: + pTileTypes = gUnk_08122862; + break; + case 2: + pTileTypes = gUnk_08122874; + break; + case 3: + pTileTypes = gUnk_08122886; + break; + default: + case 0: + pTileTypes = gUnk_08122850; + break; + } + + for (index = 0, iVar5 = 0; index < 9; index++) { + u32 pos = tilePos + iVar5 + index - 1; + SetTile(pTileTypes[index], pos, collisionLayer); + switch (index) { + case 2: + iVar5 = 0x3d; + break; + case 5: + iVar5 = 0x7a; + break; + } + } +} + +void sub_08093248(ObjectBlockingStairsEntity* this) { + u32 collisionLayer; + u32 tilePos; + u32 index; + int iVar4; + + tilePos = this->tilePos - 0x40; + collisionLayer = super->collisionLayer; + for (index = 0, iVar4 = 0; index < 9; index++) { + sub_0807BA8C(tilePos + iVar4 + index - 1, collisionLayer); + switch (index) { + case 2: + iVar4 = 0x3d; + break; + case 5: + iVar4 = 0x7a; + break; + } + } +} + +void sub_08093280(ObjectBlockingStairsEntity* this) { + sub_0800445C(super); + LinearMoveUpdate(super); + if (--super->actionDelay == 0) { + sub_08093334(this); + } + sub_08093364(this); +} + +void sub_080932A8(ObjectBlockingStairsEntity* this) { + this->unk7a--; + switch (this->unk7a & 3) { + case 1: + super->spriteOffsetX = 1; + break; + case 3: + super->spriteOffsetX = -1; + break; + default: + super->spriteOffsetX = 0; + break; + } +} + +typedef struct { + u32 flagBank; + u16 unk4; + u16 unk6; +} struct_gUnk_08122898; + +const struct_gUnk_08122898 gUnk_08122898[] = { + { 0x200, 0xa1, 0xa2 }, + { 0x8c0, 0x6f, 0x70 }, +}; + +u32 sub_080932D8(u32 param_1) { + const struct_gUnk_08122898* ptr = gUnk_08122898 + param_1; + + if (CheckLocalFlagByBank(ptr->flagBank, ptr->unk4)) { + return 1; + } else { + if (CheckLocalFlagByBank(ptr->flagBank, ptr->unk6)) { + return 2; + } else { + return 0; + } + } +} + +void sub_08093308(u32 param_1, u32 param_2) { + const struct_gUnk_08122898* ptr = gUnk_08122898 + param_1; + if (param_2 == 1) { + SetLocalFlagByBank(ptr->flagBank, ptr->unk4); + } else if (param_2 == 2) { + SetLocalFlagByBank(ptr->flagBank, ptr->unk6); + } +} + +void sub_08093334(ObjectBlockingStairsEntity* this) { + u32 uVar1; + + super->action = 4; + if (super->direction & 0x10) { + uVar1 = 1; + } else { + uVar1 = 2; + } + sub_080931A4(this, uVar1 + 1); + sub_08093308(super->type, uVar1); + EnqueueSFX(SFX_SECRET); +} + +void sub_08093364(ObjectBlockingStairsEntity* this) { + s32 sVar1; + Entity* dashEffectEnt; + + if ((super->actionDelay & 3) == 0) { + dashEffectEnt = CreateObject(SPECIAL_FX, FX_DASH, 0); + if (dashEffectEnt != NULL) { + dashEffectEnt->parent = super; + CopyPosition(super, dashEffectEnt); + if (super->direction & 0x10) { + dashEffectEnt->x.HALF.HI += 0x12; + } else { + dashEffectEnt->x.HALF.HI -= 0x12; + } + + sVar1 = dashEffectEnt->y.HALF.HI; + if (super->actionDelay & 8) { + dashEffectEnt->y.HALF.HI = sVar1 + 8; + } else { + dashEffectEnt->y.HALF.HI = sVar1 - 8; + } + } + } +}