diff --git a/asm/object/pushableRock.s b/asm/object/pushableRock.s deleted file mode 100644 index 8ee626ff..00000000 --- a/asm/object/pushableRock.s +++ /dev/null @@ -1,269 +0,0 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start PushableRock -PushableRock: @ 0x0808A4F4 - push {lr} - ldr r2, _0808A508 @ =gUnk_08121078 - ldrb r1, [r0, #0xc] - lsls r1, r1, #2 - adds r1, r1, r2 - ldr r1, [r1] - bl _call_via_r1 - pop {pc} - .align 2, 0 -_0808A508: .4byte gUnk_08121078 - - thumb_func_start sub_0808A50C -sub_0808A50C: @ 0x0808A50C - push {lr} - ldrb r2, [r0, #0x18] - movs r1, #4 - rsbs r1, r1, #0 - ands r1, r2 - movs r2, #1 - orrs r1, r2 - strb r1, [r0, #0x18] - ldrb r1, [r0, #0xc] - adds r1, #1 - strb r1, [r0, #0xc] - ldrb r2, [r0, #0x19] - movs r1, #0x3f - ands r1, r2 - movs r2, #0x80 - orrs r1, r2 - strb r1, [r0, #0x19] - adds r3, r0, #0 - adds r3, #0x29 - ldrb r2, [r3] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r2 - movs r2, #4 - orrs r1, r2 - movs r2, #0x39 - rsbs r2, r2, #0 - ands r1, r2 - movs r2, #0x18 - orrs r1, r2 - strb r1, [r3] - bl sub_0808A644 - pop {pc} - - thumb_func_start sub_0808A550 -sub_0808A550: @ 0x0808A550 - push {r4, lr} - adds r4, r0, #0 - adds r0, #0x74 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x38 - ldrb r1, [r1] - bl GetTileType - adds r1, r0, #0 - ldr r0, _0808A58C @ =0x0000401F - cmp r1, r0 - bhi _0808A5CC - subs r0, #3 - cmp r1, r0 - blo _0808A5CC - adds r0, r1, #0 - subs r0, #0x1c - lsls r1, r0, #1 - strb r1, [r4, #0x14] - lsls r1, r0, #3 - strb r1, [r4, #0x15] - lsls r0, r0, #0x19 - lsrs r0, r0, #0x18 - cmp r0, #2 - bne _0808A590 - ldrb r0, [r4, #0x18] - movs r1, #0x40 - orrs r0, r1 - b _0808A598 - .align 2, 0 -_0808A58C: .4byte 0x0000401F -_0808A590: - ldrb r1, [r4, #0x18] - movs r0, #0x41 - rsbs r0, r0, #0 - ands r0, r1 -_0808A598: - strb r0, [r4, #0x18] - adds r0, r4, #0 - adds r0, #0x70 - ldrh r0, [r0] - adds r1, r4, #0 - adds r1, #0x74 - ldrh r1, [r1] - adds r2, r4, #0 - adds r2, #0x38 - ldrb r2, [r2] - bl SetTile - movs r0, #2 - strb r0, [r4, #0xc] - ldrb r1, [r4, #0x14] - lsrs r1, r1, #1 - adds r1, #1 - adds r0, r4, #0 - bl InitializeAnimation - ldr r0, _0808A5C8 @ =0x0000010F - bl EnqueueSFX - b _0808A5DE - .align 2, 0 -_0808A5C8: .4byte 0x0000010F -_0808A5CC: - adds r0, r4, #0 - adds r0, #0x58 - ldrb r0, [r0] - cmp r0, #0 - beq _0808A5DE - adds r0, r4, #0 - movs r1, #0 - bl InitializeAnimation -_0808A5DE: - pop {r4, pc} - - thumb_func_start sub_0808A5E0 -sub_0808A5E0: @ 0x0808A5E0 - push {r4, r5, lr} - adds r4, r0, #0 - bl sub_0800445C - ldr r2, _0808A618 @ =gUnk_08121088 - adds r5, r4, #0 - adds r5, #0x5a - ldrb r1, [r5] - movs r0, #0xf - ands r0, r1 - lsls r0, r0, #1 - adds r0, r0, r2 - ldrh r0, [r0] - strh r0, [r4, #0x24] - adds r0, r4, #0 - bl LinearMoveUpdate - adds r0, r4, #0 - bl GetNextFrame - ldrb r1, [r5] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - beq _0808A616 - movs r0, #0 - strb r0, [r4, #0xc] -_0808A616: - pop {r4, r5, pc} - .align 2, 0 -_0808A618: .4byte gUnk_08121088 - - thumb_func_start sub_0808A61C -sub_0808A61C: @ 0x0808A61C - push {lr} - adds r2, r0, #0 - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x80 - ands r0, r1 - cmp r0, #0 - bne _0808A634 - adds r0, r2, #0 - bl GetNextFrame - b _0808A640 -_0808A634: - adds r0, r2, #0 - adds r0, #0x29 - ldrb r1, [r0] - movs r2, #7 - orrs r1, r2 - strb r1, [r0] -_0808A640: - pop {pc} - .align 2, 0 - - thumb_func_start sub_0808A644 -sub_0808A644: @ 0x0808A644 - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r0, #0x2e - ldrsh r1, [r4, r0] - ldr r2, _0808A6D0 @ =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, #0x74 - strh r1, [r5] - ldrh r0, [r5] - adds r6, r4, #0 - adds r6, #0x38 - ldrb r1, [r6] - bl GetTileIndex - adds r1, r4, #0 - adds r1, #0x70 - strh r0, [r1] - ldrh r0, [r5] - ldrb r1, [r6] - bl sub_080002E0 - adds r1, r4, #0 - adds r1, #0x72 - strb r0, [r1] - ldrh r0, [r5] - ldrb r1, [r6] - bl sub_080002C8 - cmp r0, #0x19 - beq _0808A69E - cmp r0, #0xf0 - bne _0808A6E2 -_0808A69E: - ldr r0, _0808A6D4 @ =0x00004015 - ldrh r1, [r5] - ldrb r2, [r6] - bl SetTile - movs r0, #3 - strb r0, [r4, #0xc] - adds r5, r4, #0 - adds r5, #0x86 - ldrh r0, [r5] - bl CheckFlags - cmp r0, #0 - bne _0808A6D8 - ldrh r0, [r5] - bl SetFlag - movs r0, #0xcd - bl SoundReq - adds r0, r4, #0 - movs r1, #5 - bl InitializeAnimation - b _0808A6EC - .align 2, 0 -_0808A6D0: .4byte gRoomControls -_0808A6D4: .4byte 0x00004015 -_0808A6D8: - adds r0, r4, #0 - movs r1, #6 - bl InitializeAnimation - b _0808A6EC -_0808A6E2: - ldr r0, _0808A6F0 @ =0x0000401B - ldrh r1, [r5] - ldrb r2, [r6] - bl SetTile -_0808A6EC: - pop {r4, r5, r6, pc} - .align 2, 0 -_0808A6F0: .4byte 0x0000401B diff --git a/data/const/object/pushableRock.s b/data/const/object/pushableRock.s deleted file mode 100644 index a795b34e..00000000 --- a/data/const/object/pushableRock.s +++ /dev/null @@ -1,14 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .section .rodata - .align 2 - -gUnk_08121078:: @ 08121078 - .4byte sub_0808A50C - .4byte sub_0808A550 - .4byte sub_0808A5E0 - .4byte sub_0808A61C - -gUnk_08121088:: @ 08121088 - .incbin "pushableRock/gUnk_08121088.bin" diff --git a/include/functions.h b/include/functions.h index c298432d..769b053f 100644 --- a/include/functions.h +++ b/include/functions.h @@ -165,4 +165,10 @@ extern void sub_0806FBB4(Entity*); extern u32 sub_080002D4(s32, s32, u32); extern void sub_08078930(Entity*); extern void sub_080044AE(Entity*, u32, u32); +extern void sub_0801AF18(u8*, u32, u32); +extern void sub_0807B9B8(s32, s32, s32); +extern void sub_08000148(u32, u32, u32); +extern void sub_0805457C(Entity*, s32); +extern Entity* sub_080A2A3C(Entity*, u32, u32, u32); +extern void sub_0806FCF4(Entity*, s32, s32, s32); #endif diff --git a/include/object.h b/include/object.h index 4b3fb61c..da910632 100644 --- a/include/object.h +++ b/include/object.h @@ -233,7 +233,7 @@ void Button(Entity*); void MinishEmoticon(Entity*); void Pot(Entity*); void EzloCap(Entity*); -void BlockPushed(Entity*); +void BlockPushed(); void LockedDoor(Entity*); void Object9(Entity*); void ObjectA(Entity*); @@ -265,18 +265,18 @@ void EyeSwitch(Entity*); void PressurePlate(); void BigBarrel(Entity*); void BarrelInside(Entity*); -void PushableStatue(Entity*); +void PushableStatue(); void Object28(Entity*); void AmbientClouds(Entity*); void Object2A(Entity*); void Object2B(Entity*); void Beanstalk(Entity*); void Smoke(Entity*); -void PushableRock(Entity*); +void PushableRock(); void HittableLever(); void Object30(Entity*); void FrozenFlower(Entity*); -void PullableMushroom(Entity*); +void PullableMushroom(); void Bollard(Entity*); void WarpPoint(Entity*); void Object35(Entity*); @@ -302,7 +302,7 @@ void FileScreenObjects(Entity*); void Object49(Entity*); void BackgroundCloud(Entity*); void Object4B(Entity*); -void PushableFurniture(Entity*); +void PushableFurniture(); void Furniture(Entity*); void MinishSizedEntrance(Entity*); void Archway(Entity*); @@ -339,7 +339,7 @@ void ObjectOnPillar(Entity*); void MineralWaterSource(Entity*); void MinishSizedArchway(Entity*); void Object70(Entity*); -void PushableGrave(Entity*); +void PushableGrave(); void StoneTablet(Entity*); void LilypadSmall(Entity*); void Object74(Entity*); @@ -358,8 +358,8 @@ void Board(Entity*); void Object81(Entity*); void BigVortex(Entity*); void BigPushableLever(); -void SmallIceBlock(Entity*); -void BigIceBlock(Entity*); +void SmallIceBlock(); +void BigIceBlock(); void Object86(Entity*); void OctorokBossObject(Entity*); void MacroBook(Entity*); diff --git a/include/room.h b/include/room.h index 0cd7f3c2..fb3d2630 100644 --- a/include/room.h +++ b/include/room.h @@ -76,7 +76,8 @@ typedef struct { /* 0x4c */ u8 filler5[28]; /* 0x68 */ u32 animFlags; /* 0x6c */ void* field_0x6c[8]; - /* 0x8c */ void* field_0x8c[16]; + /* 0x8c */ void* field_0x8c[8]; + /* 0xac */ void* field_0xac[8]; } RoomVars; static_assert(sizeof(RoomVars) == 0xCC); extern RoomVars gRoomVars; diff --git a/src/object/pushableRock.c b/src/object/pushableRock.c new file mode 100644 index 00000000..a176e2da --- /dev/null +++ b/src/object/pushableRock.c @@ -0,0 +1,123 @@ +/** + * @file pushableRock.c + * @ingroup Objects + * + * @brief Pushable Rock object + */ + +#define NENT_DEPRECATED +#include "global.h" +#include "object.h" +#include "functions.h" + +typedef struct { + /*0x00*/ Entity base; + /*0x68*/ u8 unk_68[8]; + /*0x70*/ u16 tileIndex; + /*0x72*/ u8 unk_72; + /*0x73*/ u8 unk_73; + /*0x74*/ u16 tilePosition; + /*0x76*/ u8 unk_76[0x10]; + /*0x86*/ u16 pushedFlag; +} PushableRockEntity; + +extern void (*const PushableRock_Actions[])(PushableRockEntity*); +extern const u16 PushableRock_Speeds[]; + +void sub_0808A644(PushableRockEntity*); + +void PushableRock(PushableRockEntity* this) { + PushableRock_Actions[super->action](this); +} + +void PushableRock_Init(PushableRockEntity* this) { + super->spriteSettings.draw = 1; + super->action += 1; + super->spriteRendering.b3 = 2; + super->spritePriority.b0 = 4; + super->spritePriority.b1 = 3; + sub_0808A644(this); +} + +void PushableRock_Action1(PushableRockEntity* this) { + u32 tileType; + u32 tmp; + + tileType = GetTileType(this->tilePosition, super->collisionLayer); + switch (tileType) { + case 0x401c: + case 0x401d: + case 0x401e: + case 0x401f: + tmp = (tileType - 0x1c); + super->animationState = tmp * 2; + super->direction = tmp * 8; + if ((u8)(tmp * 2) == 2) { + super->spriteSettings.flipX = 1; + } else { + super->spriteSettings.flipX = 0; + } + SetTile(this->tileIndex, this->tilePosition, super->collisionLayer); + super->action = 2; + InitializeAnimation(super, (super->animationState >> 1) + 1); + EnqueueSFX(SFX_10F); + break; + default: + if (super->animIndex) { + InitializeAnimation(super, 0); + } + break; + } +} + +void PushableRock_Action2(PushableRockEntity* this) { + sub_0800445C(super); + super->speed = PushableRock_Speeds[super->frame & 0xf]; + LinearMoveUpdate(super); + GetNextFrame(super); + if (super->frame & 0x80) { + super->action = 0; + } +} + +void PushableRock_Action3(PushableRockEntity* this) { + if ((super->frame & 0x80) == 0) { + GetNextFrame(super); + } else { + super->spritePriority.b0 = 7; + } +} + +void sub_0808A644(PushableRockEntity* this) { + u32 tmp; + this->tilePosition = COORD_TO_TILE(super); + this->tileIndex = GetTileIndex(this->tilePosition, super->collisionLayer); + this->unk_72 = sub_080002E0(this->tilePosition, super->collisionLayer); + tmp = sub_080002C8(this->tilePosition, super->collisionLayer); + if ((tmp == 0x19) || (tmp == 0xf0)) { + SetTile(0x4015, this->tilePosition, super->collisionLayer); + super->action = 3; + if (!CheckFlags(this->pushedFlag)) { + SetFlag(this->pushedFlag); + SoundReq(SFX_TASK_COMPLETE); + InitializeAnimation(super, 5); + } else { + InitializeAnimation(super, 6); + } + } else { + SetTile(0x401b, this->tilePosition, super->collisionLayer); + } +} + +void (*const PushableRock_Actions[])(PushableRockEntity*) = { + PushableRock_Init, + PushableRock_Action1, + PushableRock_Action2, + PushableRock_Action3, +}; +const u16 PushableRock_Speeds[] = { + 0, + 256, + 96, + 64, +};