tmc/src/object/pushableGrave.c

214 lines
6.9 KiB
C

/**
* @file pushableGrave.c
* @ingroup Objects
*
* @brief Pushable Grave object
*/
#define NENT_DEPRECATED
#include "functions.h"
#include "global.h"
#include "hitbox.h"
#include "object.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 void (*const PushableGrave_Actions[])(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) {
PushableGrave_Actions[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) {
SetMultipleTiles((TileData*)gUnk_081232C0, tilePosition, super->collisionLayer);
}
}
}
}
void PushableGrave_Action1(PushableGraveEntity* this) {
if (sub_0809785C(this)) {
RequestPriorityDuration(super, super->timer);
}
}
void PushableGrave_Action2(PushableGraveEntity* this) {
if (super->subAction == 0) {
if (--super->subtimer == 0) {
super->subAction = 1;
super->subtimer = 120;
gRoomControls.camera_target = super;
gRoomControls.scrollSpeed = 2;
}
} else {
if (--super->subtimer == 0) {
super->action = 3;
super->timer = 96;
super->subtimer = 20;
RequestPriorityDuration(super, 96);
SoundReq(SFX_10F);
}
}
}
void PushableGrave_Action3(PushableGraveEntity* this) {
if (super->timer != 0) {
super->timer--;
LinearMoveUpdate(super);
sub_0800445C(super);
} else {
if (super->subtimer != 0) {
super->subtimer--;
} else {
EnqueueSFX(SFX_SECRET);
sub_080977F4(this);
if (super->type == 0) {
gRoomControls.camera_target = &gPlayerEntity;
gRoomControls.scrollSpeed = 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->timer = 64;
super->subtimer = 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->timer = 240;
super->subtimer = 60;
super->direction = 0;
super->speed = 0x40;
RestorePrevTileEntity(this->unk_68, super->collisionLayer);
RestorePrevTileEntity(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 PushableGrave_Actions[])(PushableGraveEntity*) = {
PushableGrave_Init, PushableGrave_Action1, PushableGrave_Action2, PushableGrave_Action3, PushableGrave_Action4,
};
// TODO recreate as TileData[]
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,
};