Files
tmc/src/object/shrinkingHieroglyphs.c
T
2023-12-30 22:09:30 +01:00

119 lines
3.6 KiB
C

/**
* @file shrinkingHieroglyphs.c
* @ingroup Objects
*
* @brief Shrinking Hieroglyphs object
*/
#include "entity.h"
#include "functions.h"
#include "player.h"
#include "sound.h"
typedef struct {
Entity base;
u8 filler[0x4];
u32 unk6c;
union SplitWord objDir;
u32 unk74;
u16 unk78;
u16 unk7a;
u16 unk7c;
s16 unk7e;
} ShrinkingHieroglyphsEntity;
void ShrinkingHieroglyphs_Init(ShrinkingHieroglyphsEntity*);
void ShrinkingHieroglyphs_Action1(ShrinkingHieroglyphsEntity*);
void ShrinkingHieroglyphs_Action2(ShrinkingHieroglyphsEntity*);
void sub_08098130(ShrinkingHieroglyphsEntity*);
void ShrinkingHieroglyphs(Entity* this) {
static void (*const ShrinkingHieroglyphs_Actions[])(ShrinkingHieroglyphsEntity*) = {
ShrinkingHieroglyphs_Init,
ShrinkingHieroglyphs_Action1,
ShrinkingHieroglyphs_Action2,
};
if ((gPlayerState.flags & PL_MINISH) != 0) {
DeleteThisEntity();
}
ShrinkingHieroglyphs_Actions[this->action]((ShrinkingHieroglyphsEntity*)this);
}
void ShrinkingHieroglyphs_Init(ShrinkingHieroglyphsEntity* this) {
static const u8 ShrinkingHieroglyphs_Directions[] = { DirectionSouthWest, DirectionWest, DirectionNorthWest,
DirectionNorthEast, DirectionEast, DirectionSouthEast };
super->action++;
super->speed = 0;
this->unk6c = 0;
this->unk7a = 0x1200;
super->timer = 0;
super->subtimer = 30;
this->objDir.HALF.HI = ShrinkingHieroglyphs_Directions[super->type];
this->unk74 = 0x2000;
SetEntityPriority(super, 6);
if (super->type == 0) {
this->unk7e = 0x40;
LoadSwapGFX(super, 1, 0);
InitAnimationForceUpdate(super, super->type);
} else {
Entity* parent;
super->spriteVramOffset = super->parent->spriteVramOffset;
parent = super->parent;
super->frameIndex = super->type * 13 + parent->frameIndex;
}
sub_08098130(this);
}
void ShrinkingHieroglyphs_Action1(ShrinkingHieroglyphsEntity* this) {
if (super->type == 0) {
UpdateAnimationSingleFrame(super);
if (super->type2 != 0) {
gPlayerEntity.base.subtimer = 0;
super->action++;
InitAnimationForceUpdate(super, 1);
SoundReq(SFX_178);
}
} else {
Entity* parent = super->parent;
super->frameIndex = super->type * 13 + parent->frameIndex;
super->action = parent->action;
}
}
void ShrinkingHieroglyphs_Action2(ShrinkingHieroglyphsEntity* this) {
if (this->unk6c >= 0x140001) {
gPlayerState.flags |= PL_MINISH;
DeleteThisEntity();
} else {
if (super->type == 0) {
UpdateAnimationSingleFrame(super);
if (--this->unk7e << 16 == -0x10000) {
this->unk7e = 0x40;
SoundReq(SFX_178);
}
} else {
Entity* parent = super->parent;
super->frameIndex = super->type * 13 + parent->frameIndex;
}
this->unk6c += 0x1400;
this->objDir.WORD += this->unk74;
this->objDir.HALF.HI = DirectionNormalize(this->objDir.HALF.HI);
this->unk74 += 0x140;
if (super->subtimer-- == 0) {
super->subtimer = 30;
super->timer ^= 1;
}
sub_08098130(this);
}
}
void sub_08098130(ShrinkingHieroglyphsEntity* this) {
CopyPosition(&gPlayerEntity.base, super);
super->direction = this->objDir.HALF.HI;
super->speed = this->unk7a;
LinearMoveUpdate(super);
super->y.WORD -= Q_16_16(20.0);
super->y.WORD += this->unk6c;
}