mirror of https://github.com/zeldaret/tmc.git
214 lines
6.9 KiB
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,
|
|
};
|