Files
tmc/src/object/bush.c
T
2023-12-28 21:58:54 -08:00

141 lines
3.8 KiB
C

/**
* @file bush.c
* @ingroup Objects
*
* @brief Bush object
*/
#define NENT_DEPRECATED
#include "functions.h"
#include "hitbox.h"
#include "object.h"
typedef struct {
/*0x00*/ Entity base;
/*0x68*/ u8 unk_68[8];
/*0x70*/ u16 unk_70;
/*0x72*/ u8 unk_72;
} BushEntity;
typedef struct {
u8 unk_0;
u8 unk_1;
u8 unk_2;
} struct_08120588;
void Bush_Init(BushEntity*);
void Bush_Action1(BushEntity*);
void Bush_Action2(BushEntity*);
void Bush_Action2SubAction0(BushEntity*);
void Bush_Action2SubAction1(BushEntity*);
void Bush_Action2SubAction2(BushEntity*);
void Bush_Action2SubAction3(BushEntity*);
void Bush_Action2SubAction4(BushEntity*);
void Bush_Action2SubAction5(BushEntity*);
void Bush(BushEntity* this) {
static void (*const Bush_Actions[])(BushEntity*) = {
Bush_Init,
Bush_Action1,
Bush_Action2,
};
if (!EntityDisabled(super)) {
Bush_Actions[super->action](this);
}
}
extern const Hitbox gUnk_081205B4;
void Bush_Init(BushEntity* this) {
static const struct_08120588 gUnk_08120588[] = {
{ 0, 32, 1 }, { 0, 64, 2 }, { 0, 32, 2 }, { 13, 1, 0 }, { 22, 1, 0 },
};
if (super->type == 3) {
Bush_Action2SubAction5(this);
}
sub_08004168(super);
if (super->type == 4) {
Bush_Action2SubAction5(this);
}
super->action = 2;
super->flags |= ENT_COLLIDE;
super->spriteRendering.b3 = 2;
super->gustJarTolerance = gUnk_08120588[super->type].unk_1;
super->gustJarFlags = gUnk_08120588[super->type].unk_2;
super->speed = 0x80;
super->collisionLayer = gPlayerEntity.collisionLayer;
super->health = 1;
super->collisionFlags = 7;
super->hitType = 0x6e;
super->flags2 = 4;
super->hitbox = (Hitbox*)&gUnk_081205B4;
this->unk_72 = 0;
this->unk_70 = GetTileIndex(COORD_TO_TILE(super), super->collisionLayer);
SetTile(0x4022, COORD_TO_TILE(super), super->collisionLayer);
InitializeAnimation(super, gUnk_08120588[super->type].unk_0);
}
void Bush_Action1(BushEntity* this) {
if (((gPlayerState.field_0x1c & 0xf) != 1) || ((super->contactFlags & 0x7f) != 0x13)) {
RestorePrevTileEntity(COORD_TO_TILE(super), super->collisionLayer);
DeleteThisEntity();
}
}
void Bush_Action2(BushEntity* this) {
static void (*const Bush_Action2SubActions[])(BushEntity*) = {
Bush_Action2SubAction0, Bush_Action2SubAction1, Bush_Action2SubAction2,
Bush_Action2SubAction3, Bush_Action2SubAction4, Bush_Action2SubAction5,
};
Bush_Action2SubActions[super->subAction](this);
}
const Hitbox gUnk_081205B4 = { 0, 0, { 6, 3, 3, 6 }, 6, 6 };
void Bush_Action2SubAction0(BushEntity* this) {
super->subAction = 1;
Bush_Action2SubAction1(this);
}
void Bush_Action2SubAction1(BushEntity* this) {
Bush_Action1(this);
sub_0806F4E8(super);
if ((super->gustJarTolerance != 0) && (--super->gustJarTolerance == 0)) {
super->subAction = 2;
}
}
void Bush_Action2SubAction2(BushEntity* this) {
if (this->unk_72 == 0) {
this->unk_72 = 1;
super->spriteOffsetX = 0;
sub_0807B9B8(this->unk_70, COORD_TO_TILE(super), super->collisionLayer);
}
if (((gPlayerState.field_0x1c & 0xf) != 1) || ((super->contactFlags & 0x7f) != 0x13)) {
Bush_Action2SubAction5(this);
}
if (sub_0806F3E4(super) && ((super->gustJarFlags & 0xf) == 1)) {
DeleteThisEntity();
}
}
void Bush_Action2SubAction3(BushEntity* this) {
}
void Bush_Action2SubAction4(BushEntity* this) {
}
void Bush_Action2SubAction5(BushEntity* this) {
switch (super->type2) {
case 0xff:
break;
case 0xf:
CreateFx(super, super->timer, 0x80);
break;
case 0:
break;
default:
CreateObjectWithParent(super, super->type2, super->timer, 0);
break;
}
DeleteThisEntity();
}