Decompile PushableRock

This commit is contained in:
octorock 2022-01-29 23:55:23 +01:00
parent d34aa9166f
commit ff7147e9da
6 changed files with 139 additions and 292 deletions

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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*);

View File

@ -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;

123
src/object/pushableRock.c Normal file
View File

@ -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,
};