tmc/src/enemy/lakituCloud.c

163 lines
3.1 KiB
C

#include "global.h"
#include "asm.h"
#include "entity.h"
#include "player.h"
#include "functions.h"
#include "effects.h"
extern u32 GetNextFunction(Entity*);
extern void (*const gUnk_080D0418[6])(Entity*);
extern void (*const gUnk_080D0430[3])(Entity*);
extern void (*const gUnk_080D043C[3])(Entity*);
extern void sub_0800449C(Entity*, u32);
extern void sub_0803CE14(Entity*);
extern void sub_0803CE3C(Entity*);
extern void sub_08079D84(void);
extern void sub_080A2CC0(Entity*, Entity**, u16*);
void LakituCloud(Entity* this) {
gUnk_080D0418[GetNextFunction(this)](this);
}
void sub_0803CCD4(Entity* this) {
gUnk_080D0430[this->action](this);
}
void sub_0803CCEC(Entity* this) {
this->knockbackDuration = 0;
sub_0803CCD4(this);
}
void sub_0803CCFC(Entity* this) {
if (sub_0806F520(this) == 0) {
if (this->subAction == 2) {
sub_0803CE3C(this);
}
} else {
gUnk_080D043C[this->subAction](this);
}
}
void sub_0803CD2C(Entity* this) {
this->subAction = 1;
this->field_0x1d = 0x3c;
}
void sub_0803CD38(Entity* this) {
sub_0806F4E8(this);
}
void sub_0803CD40(Entity* this) {
if (!sub_0806F3E4(this)) {
return;
}
ModHealth(-2);
sub_0800449C(&gPlayerEntity, 122);
sub_08079D84();
sub_0803CE3C(this);
}
void sub_0803CD6C(Entity* this) {
Entity* lakitu;
this->action = 1;
this->z.HALF.HI = -2;
// Set parent to lakitu
lakitu = GetCurrentRoomProperty(this->type);
this->child = lakitu;
this->parent = lakitu;
this->field_0x78.HWORD = this->x.HALF.HI;
this->field_0x7a.HWORD = this->y.HALF.HI;
InitAnimationForceUpdate(this, 4);
sub_0803CE14(this);
}
void sub_0803CDA8(Entity* this) {
UpdateAnimationSingleFrame(this);
if ((this->direction & 0x80) == 0) {
sub_0806F69C(this);
}
if (--this->field_0x74.HWORD << 0x10 == 0) {
sub_0803CE14(this);
}
}
void sub_0803CDD8(Entity* this) {
u8 one;
u8 draw;
draw = this->spriteSettings.draw;
one = 1;
this->spriteSettings.draw = draw ^ one;
this->actionDelay--;
if (this->actionDelay == 0) {
this->action = 1;
COLLISION_ON(this);
this->spriteSettings.draw = one;
}
}
void sub_0803CE14(Entity* this) {
u8 direction;
sub_080A2CC0(this, &this->child, &this->field_0x74.HWORD);
direction = this->direction;
if (direction & 0x80) {
return;
}
direction = direction / 8 + 4;
InitAnimationForceUpdate(this, direction);
}
void sub_0803CE3C(Entity* this) {
CreateFx(this, FX_DEATH, 0);
this->action = 2;
this->actionDelay = 60;
COLLISION_OFF(this);
this->field_0x3a &= 0xfb;
this->x.HALF.HI = this->field_0x78.HWORD;
this->y.HALF.HI = this->field_0x7a.HWORD;
this->child = this->parent;
sub_0803CE14(this);
}
void (*const gUnk_080D0418[])(Entity*) = {
sub_0803CCD4, sub_0803CCD4, sub_0803CCEC, sub_0804A7D4, sub_08001242, sub_0803CCFC,
};
void (*const gUnk_080D0430[])(Entity*) = {
sub_0803CD6C,
sub_0803CDA8,
sub_0803CDD8,
};
void (*const gUnk_080D043C[])(Entity*) = {
sub_0803CD2C,
sub_0803CD38,
sub_0803CD40,
};