tmc/src/object/pushableStatue.c

277 lines
8.0 KiB
C

/**
* @file pushableStatue.c
* @ingroup Objects
*
* @brief Pushable Statue object
*/
#define NENT_DEPRECATED
#include "global.h"
#include "object.h"
#include "functions.h"
#include "hitbox.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unk_68[0x18];
/*0x80*/ u16 unk_80;
/*0x82*/ u8 unk_82;
/*0x83*/ u8 unk_83;
/*0x84*/ u16 unk_84;
/*0x86*/ u16 unk_86;
} PushableStatueEntity;
extern const s16 gUnk_080B4488[];
extern const s16 gUnk_080B4468[];
extern void (*const PushableStatue_Actions[])(PushableStatueEntity*);
extern void (*const PushableStatue_SubActions[])(PushableStatueEntity*);
extern const s8 gUnk_08120CB4[];
extern const u16 gUnk_08120CBC[];
extern const u16 gUnk_08120CCC[];
extern const u16 gUnk_08120D6C[];
u32 sub_0808968C(u32);
bool32 sub_0808965C(PushableStatueEntity*);
void sub_08089454(PushableStatueEntity*);
void sub_080894C8(PushableStatueEntity*);
void sub_08089538(PushableStatueEntity*);
void sub_080894FC(PushableStatueEntity*);
bool32 sub_080895C0(PushableStatueEntity*);
bool32 sub_080896B0(void);
void PushableStatue(PushableStatueEntity* this) {
PushableStatue_Actions[super->action](this);
}
void PushableStatue_Init(PushableStatueEntity* this) {
if (sub_0808965C(this)) {
super->action = 1;
super->speed = 0x80;
super->updatePriority = 3;
super->hitbox = (Hitbox*)&gUnk_080FD1F4;
super->field_0x16 = 1;
this->unk_86 = 0;
sub_08089454(this);
sub_080894C8(this);
InitializeAnimation(super, 0);
}
}
void PushableStatue_Action1(PushableStatueEntity* this) {
u16 tileType;
Entity* obj;
if (sub_0800442E(super) == 0) {
tileType = GetTileType(this->unk_84, super->collisionLayer);
if (tileType != 0x400b) {
switch (sub_0808968C(tileType)) {
case 1:
super->action = 3;
super->direction = ((tileType - 0xc) & 3) << 3;
sub_08089538(this);
break;
case 0:
obj = CreateObject(SPECIAL_FX, 4, 0);
if (obj != NULL) {
CopyPosition(super, obj);
}
sub_080894FC(this);
break;
case 2:
this->unk_80 = tileType;
break;
}
} else {
sub_08078930(super);
}
}
}
void PushableStatue_Action2(PushableStatueEntity* this) {
if (this->unk_86 != 0) {
sub_080895C0(this);
} else {
if (gPlayerState.heldObject == 0) {
super->subAction = 6;
}
PushableStatue_SubActions[super->subAction - 5](this);
}
}
void PushableStatue_SubAction0(PushableStatueEntity* this) {
u16 tileType;
Entity* obj;
u32 index;
const s8* ptr;
if (this->unk_83 == 0) {
this->unk_83 = 1;
index = gPlayerEntity.animationState;
ptr = &gUnk_08120CB4[index];
PositionRelative(super, &gPlayerEntity, *(ptr) << 0x10, *(ptr + 1) << 0x10);
}
tileType = GetTileType(this->unk_84, super->collisionLayer);
if (tileType != 0x400b) {
switch (sub_0808968C(tileType)) {
case 1:
super->direction = (((tileType - 0xc) & 3) << 3);
sub_08089538(this);
break;
case 0:
obj = CreateObject(SPECIAL_FX, 4, 0);
if (obj != NULL) {
CopyPosition(super, obj);
}
sub_080894FC(this);
return;
case 2:
this->unk_80 = tileType;
break;
}
}
if (sub_080896B0()) {
gPlayerState.queued_action = 0x10;
gPlayerState.field_0x38 = 0x20;
gPlayerState.flags |= 1;
gPlayerEntity.x.HALF.LO = 0;
gPlayerEntity.y.HALF.LO = 0;
super->direction = (gPlayerEntity.animationState ^ 4) << 2;
sub_08089538(this);
}
}
void PushableStatue_SubAction1(PushableStatueEntity* this) {
super->action = 1;
this->unk_83 = 0;
}
void PushableStatue_Action3(PushableStatueEntity* this) {
if (sub_080895C0(this)) {
super->action = 1;
}
}
void PushableStatue_Action4(PushableStatueEntity* this) {
if (--super->actionDelay != 0) {
super->spriteSettings.draw ^= 1;
} else {
super->spriteSettings.draw = 1;
super->action = 1;
SetTile(0x400b, this->unk_84, super->collisionLayer);
sub_080894C8(this);
}
}
void sub_08089454(PushableStatueEntity* this) {
this->unk_84 = COORD_TO_TILE(super);
this->unk_80 = GetTileIndex(this->unk_84, super->collisionLayer);
SetTile(0x400b, this->unk_84, super->collisionLayer);
if (super->collisionLayer == 2 && GetTileType(this->unk_84, 1) == 0x310) {
SetTile(0x400b, this->unk_84, 1);
}
}
void sub_080894C8(PushableStatueEntity* this) {
u32 index;
for (index = 0; index < 8; index++) {
if (gRoomVars.entities[index] == NULL) {
gRoomVars.entities[index] = super;
break;
}
}
}
void sub_080894FC(PushableStatueEntity* this) {
u32 index;
for (index = 0; index <= 7; index++) {
if (super == gRoomVars.entities[index]) {
gRoomVars.entities[index] = NULL;
break;
}
}
DeleteEntity(super);
}
void sub_08089538(PushableStatueEntity* this) {
u16 tileType;
this->unk_86 = 0x20;
EnqueueSFX(SFX_10F);
SetTile(this->unk_80, this->unk_84, super->collisionLayer);
if ((super->collisionLayer == 2) && (GetTileType(this->unk_84, 1) == 0x400b)) {
sub_08000152(0x310, this->unk_84, 1);
}
tileType = GetTileType(this->unk_84 + gUnk_080B4488[super->direction >> 3], super->collisionLayer);
if ((tileType == 0x79) || (tileType == 0x77)) {
super->spriteOffsetY = -2;
}
}
bool32 sub_080895C0(PushableStatueEntity* this) {
Entity* obj;
LinearMoveUpdate(super);
if ((--this->unk_86 == 0) && (sub_0800442E(super) == 0)) {
super->spriteOffsetY = 0;
if (!sub_080002D0(super)) {
sub_08089454(this);
return TRUE;
}
obj = CreateObject(SPECIAL_FX, 4, 0);
if (obj != NULL) {
CopyPosition(super, obj);
}
super->spriteSettings.draw = 0;
super->x.HALF.HI += gUnk_08120CBC[super->direction >> 2];
super->y.HALF.HI += gUnk_08120CBC[(super->direction >> 2) + 1];
sub_08089454(this);
super->action = 4;
super->actionDelay = 0x3c;
}
sub_0800445C(super);
return FALSE;
}
bool32 sub_0808965C(PushableStatueEntity* this) {
if (gRoomControls.area < 0x40) {
return LoadFixedGFX(super, 0xe9);
} else {
return LoadFixedGFX(super, gUnk_08120CCC[gRoomControls.area - 0x40]);
}
}
u32 sub_0808968C(u32 param_1) {
const u16* it;
for (it = gUnk_08120D6C; *it != 0; it += 2) {
if (*it == param_1) {
return it[1];
}
}
return 0;
}
ASM_FUNC("asm/non_matching/pushableStatue/sub_080896B0.inc", bool32 sub_080896B0(void))
void (*const PushableStatue_Actions[])(PushableStatueEntity*) = {
PushableStatue_Init, PushableStatue_Action1, PushableStatue_Action2, PushableStatue_Action3, PushableStatue_Action4,
};
void (*const PushableStatue_SubActions[])(PushableStatueEntity*) = {
PushableStatue_SubAction0,
PushableStatue_SubAction1,
};
const s8 gUnk_08120CB4[] = {
0, 14, -14, 2, 0, -14, 14, 2,
};
const u16 gUnk_08120CBC[] = {
0, 16, 65520, 0, 0, 65520, 16, 0,
};
const u16 gUnk_08120CCC[] = {
29, 29, 29, 29, 29, 29, 29, 29, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 75, 75, 75,
75, 75, 75, 75, 75, 76, 76, 76, 76, 76, 76, 76, 76, 77, 77, 77, 77, 77, 77, 77, 77, 78, 78, 78, 78, 78, 78,
78, 78, 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 81, 81, 81, 81, 81, 81,
};
const u16 gUnk_08120D6C[] = {
0x400c, 1, 0x400d, 1, 0x400e, 1, 0x400f, 1, 0x7a, 2, 0x78, 2, 0,
};