From 23424bf194d12adb28a82b40b83dfae46a20c717 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sat, 29 Jan 2022 23:56:04 +0100 Subject: [PATCH] Decompile PushableGrave --- asm/object/pushableGrave.s | 537 ------------------------------ data/const/object/pushableGrave.s | 18 - src/object/pushableGrave.c | 213 ++++++++++++ 3 files changed, 213 insertions(+), 555 deletions(-) delete mode 100644 asm/object/pushableGrave.s delete mode 100644 data/const/object/pushableGrave.s create mode 100644 src/object/pushableGrave.c diff --git a/asm/object/pushableGrave.s b/asm/object/pushableGrave.s deleted file mode 100644 index 7f763ea2..00000000 --- a/asm/object/pushableGrave.s +++ /dev/null @@ -1,537 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start PushableGrave -PushableGrave: @ 0x08097588 - push {lr} - ldr r2, _0809759C @ =gUnk_081232AC - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0809759C: .4byte gUnk_081232AC - - thumb_func_start sub_080975A0 -sub_080975A0: @ 0x080975A0 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r4, r0, #0 - ldrb r1, [r4, #0x18] - movs r0, #4 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r4, #0x18] - ldrb r0, [r4, #0xa] - strb r0, [r4, #0x1e] - ldrb r1, [r4, #0x11] - movs r0, #0x10 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #3 - orrs r0, r1 - strb r0, [r4, #0x11] - movs r1, #0x2e - ldrsh r0, [r4, r1] - ldr r2, _08097690 @ =gRoomControls - mov r8, r2 - ldrh r1, [r2, #6] - subs r0, r0, r1 - asrs r5, r0, #4 - movs r6, #0x3f - ands r5, r6 - movs r1, #0x32 - ldrsh r0, [r4, r1] - ldrh r1, [r2, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r6 - lsls r0, r0, #6 - orrs r5, r0 - adds r0, r5, #0 - subs r0, #0x41 - adds r7, r4, #0 - adds r7, #0x38 - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x6a - strh r0, [r1] - adds r0, r5, #0 - subs r0, #0x40 - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x6c - strh r0, [r1] - adds r0, r5, #0 - subs r0, #0x3f - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x6e - strh r0, [r1] - subs r0, r5, #1 - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x70 - strh r0, [r1] - ldrb r1, [r7] - adds r0, r5, #0 - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x72 - strh r0, [r1] - adds r0, r5, #1 - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x74 - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x3f - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x76 - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x40 - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x78 - strh r0, [r1] - adds r0, r5, #0 - adds r0, #0x41 - ldrb r1, [r7] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x7a - strh r0, [r1] - adds r0, r4, #0 - bl sub_0809798C - cmp r0, #0 - beq _080976A2 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08097694 - ldrh r0, [r4, #0x32] - subs r0, #0x16 - b _08097698 - .align 2, 0 -_08097690: .4byte gRoomControls -_08097694: - ldrh r0, [r4, #0x32] - subs r0, #0x10 -_08097698: - strh r0, [r4, #0x32] - adds r0, r4, #0 - bl sub_080977F4 - b _08097722 -_080976A2: - movs r0, #1 - strb r0, [r4, #0xc] - movs r2, #0x2e - ldrsh r0, [r4, r2] - mov r2, r8 - ldrh r1, [r2, #6] - subs r0, r0, r1 - asrs r5, r0, #4 - ands r5, r6 - movs r1, #0x32 - ldrsh r0, [r4, r1] - ldrh r1, [r2, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r6 - lsls r0, r0, #6 - orrs r5, r0 - adds r0, r4, #0 - adds r0, #0x68 - strh r5, [r0] - ldr r1, _080976FC @ =gUnk_081232DE - ldrb r0, [r4, #0xb] - lsls r0, r0, #1 - adds r0, r0, r1 - ldrh r6, [r0] - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _08097704 - ldr r0, _08097700 @ =gUnk_080FD578 - str r0, [r4, #0x48] - subs r1, r5, #1 - ldrb r2, [r7] - adds r0, r6, #0 - bl SetTile - ldrb r2, [r7] - adds r0, r6, #0 - adds r1, r5, #0 - bl SetTile - ldrh r0, [r4, #0x32] - adds r0, #2 - strh r0, [r4, #0x32] - b _08097722 - .align 2, 0 -_080976FC: .4byte gUnk_081232DE -_08097700: .4byte gUnk_080FD578 -_08097704: - ldr r0, _08097728 @ =gUnk_080FD570 - str r0, [r4, #0x48] - ldrb r2, [r7] - adds r0, r6, #0 - adds r1, r5, #0 - bl SetTile - ldrb r0, [r4, #0xb] - cmp r0, #2 - bne _08097722 - ldr r0, _0809772C @ =gUnk_081232C0 - ldrb r2, [r7] - adds r1, r5, #0 - bl sub_0801AF18 -_08097722: - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08097728: .4byte gUnk_080FD570 -_0809772C: .4byte gUnk_081232C0 - - thumb_func_start sub_08097730 -sub_08097730: @ 0x08097730 - push {r4, lr} - adds r4, r0, #0 - bl sub_0809785C - cmp r0, #0 - beq _08097744 - ldrb r1, [r4, #0xe] - adds r0, r4, #0 - bl RequestPriorityDuration -_08097744: - pop {r4, pc} - .align 2, 0 - - thumb_func_start sub_08097748 -sub_08097748: @ 0x08097748 - push {lr} - adds r2, r0, #0 - ldrb r0, [r2, #0xd] - cmp r0, #0 - bne _08097774 - ldrb r0, [r2, #0xf] - subs r0, #1 - strb r0, [r2, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809779A - movs r0, #1 - strb r0, [r2, #0xd] - movs r0, #0x78 - strb r0, [r2, #0xf] - ldr r1, _08097770 @ =gRoomControls - str r2, [r1, #0x30] - movs r0, #2 - strb r0, [r1, #0xe] - b _0809779A - .align 2, 0 -_08097770: .4byte gRoomControls -_08097774: - ldrb r0, [r2, #0xf] - subs r0, #1 - strb r0, [r2, #0xf] - lsls r0, r0, #0x18 - cmp r0, #0 - bne _0809779A - movs r0, #3 - strb r0, [r2, #0xc] - movs r0, #0x60 - strb r0, [r2, #0xe] - movs r0, #0x14 - strb r0, [r2, #0xf] - adds r0, r2, #0 - movs r1, #0x60 - bl RequestPriorityDuration - ldr r0, _0809779C @ =0x0000010F - bl SoundReq -_0809779A: - pop {pc} - .align 2, 0 -_0809779C: .4byte 0x0000010F - - thumb_func_start sub_080977A0 -sub_080977A0: @ 0x080977A0 - push {r4, lr} - adds r4, r0, #0 - ldrb r0, [r4, #0xe] - cmp r0, #0 - beq _080977BC - subs r0, #1 - strb r0, [r4, #0xe] - adds r0, r4, #0 - bl LinearMoveUpdate - adds r0, r4, #0 - bl sub_0800445C - b _080977E4 -_080977BC: - ldrb r0, [r4, #0xf] - cmp r0, #0 - beq _080977C8 - subs r0, #1 - strb r0, [r4, #0xf] - b _080977E4 -_080977C8: - movs r0, #0x72 - bl EnqueueSFX - adds r0, r4, #0 - bl sub_080977F4 - ldrb r0, [r4, #0xa] - cmp r0, #0 - bne _080977E4 - ldr r0, _080977E8 @ =gRoomControls - ldr r1, _080977EC @ =gPlayerEntity - str r1, [r0, #0x30] - movs r1, #4 - strb r1, [r0, #0xe] -_080977E4: - pop {r4, pc} - .align 2, 0 -_080977E8: .4byte gRoomControls -_080977EC: .4byte gPlayerEntity - - thumb_func_start nullsub_528 -nullsub_528: @ 0x080977F0 - bx lr - .align 2, 0 - - thumb_func_start sub_080977F4 -sub_080977F4: @ 0x080977F4 - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - movs r1, #0 - movs r0, #4 - strb r0, [r5, #0xc] - adds r0, r5, #0 - adds r0, #0x63 - strb r1, [r0] - movs r1, #0x2e - ldrsh r0, [r5, r1] - ldr r3, _08097854 @ =gRoomControls - ldrh r1, [r3, #6] - subs r0, r0, r1 - asrs r4, r0, #4 - movs r2, #0x3f - ands r4, r2 - movs r1, #0x32 - ldrsh r0, [r5, r1] - ldrh r1, [r3, #8] - subs r0, r0, r1 - asrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r4, r0 - ldr r7, _08097858 @ =0x00004022 - adds r6, r5, #0 - adds r6, #0x38 - ldrb r2, [r6] - adds r0, r7, #0 - adds r1, r4, #0 - bl SetTile - ldrb r0, [r5, #0xa] - cmp r0, #0 - bne _08097844 - subs r1, r4, #1 - ldrb r2, [r6] - adds r0, r7, #0 - bl SetTile -_08097844: - adds r1, r5, #0 - adds r1, #0x86 - ldrh r0, [r1] - cmp r0, #0 - beq _08097852 - bl SetFlag -_08097852: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_08097854: .4byte gRoomControls -_08097858: .4byte 0x00004022 - - thumb_func_start sub_0809785C -sub_0809785C: @ 0x0809785C - push {r4, r5, r6, lr} - adds r5, r0, #0 - ldrb r4, [r5, #0xa] - cmp r4, #0 - beq _08097948 - ldrb r0, [r5, #0xb] - cmp r0, #0 - bne _0809786E - b _08097986 -_0809786E: - adds r0, r5, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - adds r4, r5, #0 - adds r4, #0x68 - adds r6, r5, #0 - adds r6, #0x38 - cmp r0, #0 - bne _08097892 - ldrh r0, [r4] - ldrb r1, [r6] - bl GetTileType - ldr r1, _08097940 @ =0x0000403F - cmp r0, r1 - bne _08097986 -_08097892: - movs r1, #0 - movs r0, #3 - strb r0, [r5, #0xc] - movs r0, #0x40 - strb r0, [r5, #0xe] - strb r1, [r5, #0xf] - strb r1, [r5, #0x15] - strh r0, [r5, #0x24] - ldrh r4, [r4] - adds r0, r5, #0 - adds r0, #0x72 - ldrh r0, [r0] - ldrb r2, [r6] - adds r1, r4, #0 - bl sub_0807B9B8 - ldrb r0, [r5, #0xb] - cmp r0, #2 - bne _08097934 - adds r0, r5, #0 - adds r0, #0x6a - ldrh r0, [r0] - adds r1, r4, #0 - subs r1, #0x41 - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x6c - ldrh r0, [r0] - adds r1, r4, #0 - subs r1, #0x40 - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x6e - ldrh r0, [r0] - adds r1, r4, #0 - subs r1, #0x3f - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x70 - ldrh r0, [r0] - subs r1, r4, #1 - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r4, #1 - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x76 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x3f - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x78 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x40 - ldrb r2, [r6] - bl sub_0807B9B8 - adds r0, r5, #0 - adds r0, #0x7a - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x41 - ldrb r2, [r6] - bl sub_0807B9B8 -_08097934: - ldr r0, _08097944 @ =0x0000010F - bl SoundReq - movs r0, #1 - b _08097988 - .align 2, 0 -_08097940: .4byte 0x0000403F -_08097944: .4byte 0x0000010F -_08097948: - adds r0, r5, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _08097986 - movs r0, #2 - strb r0, [r5, #0xc] - strb r4, [r5, #0xd] - movs r0, #0xf0 - strb r0, [r5, #0xe] - movs r0, #0x3c - strb r0, [r5, #0xf] - strb r4, [r5, #0x15] - movs r0, #0x40 - strh r0, [r5, #0x24] - adds r4, r5, #0 - adds r4, #0x68 - ldrh r0, [r4] - adds r5, #0x38 - ldrb r1, [r5] - bl sub_0807BA8C - ldrh r0, [r4] - subs r0, #1 - ldrb r1, [r5] - bl sub_0807BA8C - movs r0, #1 - b _08097988 -_08097986: - movs r0, #0 -_08097988: - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0809798C -sub_0809798C: @ 0x0809798C - push {r4, lr} - adds r1, r0, #0 - movs r4, #0 - ldrb r0, [r1, #0xa] - cmp r0, #0 - beq _0809799E - ldrb r0, [r1, #0xb] - cmp r0, #0 - beq _080979AE -_0809799E: - adds r0, r1, #0 - adds r0, #0x86 - ldrh r0, [r0] - bl CheckFlags - cmp r0, #0 - beq _080979AE - movs r4, #1 -_080979AE: - adds r0, r4, #0 - pop {r4, pc} - .align 2, 0 diff --git a/data/const/object/pushableGrave.s b/data/const/object/pushableGrave.s deleted file mode 100644 index a4a31527..00000000 --- a/data/const/object/pushableGrave.s +++ /dev/null @@ -1,18 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_081232AC:: @ 081232AC - .4byte sub_080975A0 - .4byte sub_08097730 - .4byte sub_08097748 - .4byte sub_080977A0 - .4byte nullsub_528 - -gUnk_081232C0:: @ 081232C0 - .incbin "pushableGrave/gUnk_081232C0.bin" - -gUnk_081232DE:: @ 081232DE - .incbin "pushableGrave/gUnk_081232DE.bin" diff --git a/src/object/pushableGrave.c b/src/object/pushableGrave.c new file mode 100644 index 00000000..8d9d4a92 --- /dev/null +++ b/src/object/pushableGrave.c @@ -0,0 +1,213 @@ +/** + * @file pushableGrave.c + * @ingroup Objects + * + * @brief Pushable Grave object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u16 unk_68; + /*0x6a*/ u16 unk_6a; + /*0x6c*/ u16 unk_6c; + /*0x6e*/ u16 unk_6e; + /*0x70*/ u16 unk_70; + /*0x72*/ u16 unk_72; + /*0x74*/ u16 unk_74; + /*0x76*/ u16 unk_76; + /*0x78*/ u16 unk_78; + /*0x7a*/ u16 unk_7a; + /*0x7c*/ s8 unk_7c[0xa]; + /*0x86*/ u16 pushedFlag; +} PushableGraveEntity; + +extern const Hitbox gUnk_080FD578; +extern const Hitbox gUnk_080FD570; + +extern void (*const gUnk_081232AC[])(PushableGraveEntity*); +extern const u8 gUnk_081232C0[]; +extern const u16 PushableGrave_Tiles[]; + +bool32 sub_0809798C(PushableGraveEntity*); +void sub_080977F4(PushableGraveEntity*); +bool32 sub_0809785C(PushableGraveEntity*); + +void PushableGrave(PushableGraveEntity* this) { + gUnk_081232AC[super->action](this); +} + +void PushableGrave_Init(PushableGraveEntity* this) { + u32 tilePosition; + u32 tileIndex; + + super->spriteSettings.draw = 1; + super->frameIndex = super->type; + super->updatePriority = 3; + tilePosition = COORD_TO_TILE(super); + this->unk_6a = GetTileIndex(tilePosition - 0x41, super->collisionLayer); + this->unk_6c = GetTileIndex(tilePosition - 0x40, super->collisionLayer); + this->unk_6e = GetTileIndex(tilePosition - 0x3f, super->collisionLayer); + this->unk_70 = GetTileIndex(tilePosition - 1, super->collisionLayer); + this->unk_72 = GetTileIndex(tilePosition, super->collisionLayer); + this->unk_74 = GetTileIndex(tilePosition + 1, super->collisionLayer); + this->unk_76 = GetTileIndex(tilePosition + 0x3f, super->collisionLayer); + this->unk_78 = GetTileIndex(tilePosition + 0x40, super->collisionLayer); + this->unk_7a = GetTileIndex(tilePosition + 0x41, super->collisionLayer); + if (sub_0809798C(this)) { + if (super->type == 0) { + super->y.HALF.HI -= 0x16; + } else { + super->y.HALF.HI -= 0x10; + } + sub_080977F4(this); + + } else { + super->action = 1; + tilePosition = COORD_TO_TILE(super); + this->unk_68 = tilePosition; + tileIndex = PushableGrave_Tiles[super->type2]; + if (super->type == 0) { + super->hitbox = (Hitbox*)&gUnk_080FD578; + SetTile(tileIndex, tilePosition - 1, super->collisionLayer); + SetTile(tileIndex, tilePosition, super->collisionLayer); + super->y.HALF.HI += 2; + } else { + super->hitbox = (Hitbox*)&gUnk_080FD570; + SetTile(tileIndex, tilePosition, super->collisionLayer); + if (super->type2 == 2) { + sub_0801AF18((u8*)gUnk_081232C0, tilePosition, super->collisionLayer); + } + } + } +} + +void PushableGrave_Action1(PushableGraveEntity* this) { + if (sub_0809785C(this)) { + RequestPriorityDuration(super, super->actionDelay); + } +} + +void PushableGrave_Action2(PushableGraveEntity* this) { + if (super->subAction == 0) { + if (--super->field_0xf == 0) { + super->subAction = 1; + super->field_0xf = 0x78; + gRoomControls.camera_target = super; + gRoomControls.unk5 = 2; + } + } else { + if (--super->field_0xf == 0) { + super->action = 3; + super->actionDelay = 0x60; + super->field_0xf = 0x14; + RequestPriorityDuration(super, 0x60); + SoundReq(SFX_10F); + } + } +} + +void PushableGrave_Action3(PushableGraveEntity* this) { + if (super->actionDelay != 0) { + super->actionDelay--; + LinearMoveUpdate(super); + sub_0800445C(super); + } else { + if (super->field_0xf != 0) { + super->field_0xf--; + } else { + EnqueueSFX(SFX_SECRET); + sub_080977F4(this); + if (super->type == 0) { + gRoomControls.camera_target = &gPlayerEntity; + gRoomControls.unk5 = 4; + } + } + } +} + +void PushableGrave_Action4(PushableGraveEntity* this) { +} + +void sub_080977F4(PushableGraveEntity* this) { + u32 tilePosition; + super->action = 4; + super->spriteOffsetY = 0; + tilePosition = COORD_TO_TILE(super); + SetTile(0x4022, tilePosition, super->collisionLayer); + if (super->type == 0) { + SetTile(0x4022, tilePosition - 1, super->collisionLayer); + } + if (this->pushedFlag != 0) { + SetFlag(this->pushedFlag); + } +} + +bool32 sub_0809785C(PushableGraveEntity* this) { + u32 tilePosition; + + if (super->type != 0) { + if (super->type2 != 0) { + if ((CheckFlags(this->pushedFlag) != 0) || GetTileType(this->unk_68, super->collisionLayer) == 0x403f) { + super->action = 3; + super->actionDelay = 0x40; + super->field_0xf = 0; + super->direction = 0; + super->speed = 0x40; + tilePosition = this->unk_68; + sub_0807B9B8(this->unk_72, tilePosition, super->collisionLayer); + if (super->type2 == 2) { + sub_0807B9B8(this->unk_6a, tilePosition - 0x41, super->collisionLayer); + sub_0807B9B8(this->unk_6c, tilePosition - 0x40, super->collisionLayer); + sub_0807B9B8(this->unk_6e, tilePosition - 0x3f, super->collisionLayer); + sub_0807B9B8(this->unk_70, tilePosition - 1, super->collisionLayer); + sub_0807B9B8(this->unk_74, tilePosition + 1, super->collisionLayer); + sub_0807B9B8(this->unk_76, tilePosition + 0x3f, super->collisionLayer); + sub_0807B9B8(this->unk_78, tilePosition + 0x40, super->collisionLayer); + sub_0807B9B8(this->unk_7a, tilePosition + 0x41, super->collisionLayer); + } + SoundReq(SFX_10F); + return TRUE; + } + } + + } else { + if (CheckFlags(this->pushedFlag) != 0) { + super->action = 2; + super->subAction = 0; + super->actionDelay = 0xf0; + super->field_0xf = 0x3c; + super->direction = 0; + super->speed = 0x40; + sub_0807BA8C(this->unk_68, super->collisionLayer); + sub_0807BA8C(this->unk_68 - 1, super->collisionLayer); + return TRUE; + } + } + return FALSE; +} + +bool32 sub_0809798C(PushableGraveEntity* this) { + bool32 result = FALSE; + if (((super->type == 0) || (super->type2 != 0)) && CheckFlags(this->pushedFlag)) { + result = TRUE; + } + return result; +} + +void (*const gUnk_081232AC[])(PushableGraveEntity*) = { + PushableGrave_Init, PushableGrave_Action1, PushableGrave_Action2, PushableGrave_Action3, PushableGrave_Action4, +}; +const u8 gUnk_081232C0[] = { + 61, 64, 191, 255, 61, 64, 192, 255, 61, 64, 193, 255, 61, 64, 255, + 255, 61, 64, 1, 0, 61, 64, 63, 0, 61, 64, 65, 0, 255, 255, +}; +const u16 PushableGrave_Tiles[] = { + 0x4022, + 0x403e, + 0x403e, +};