mirror of https://github.com/zeldaret/tmc.git
252 lines
6.3 KiB
C
252 lines
6.3 KiB
C
/**
|
|
* @file keaton.c
|
|
* @ingroup Enemies
|
|
*
|
|
* @brief keaton enemy
|
|
*/
|
|
|
|
#include "enemy.h"
|
|
#include "functions.h"
|
|
|
|
extern Entity* gUnk_020000B0;
|
|
|
|
extern void (*const gUnk_080CE7B0[])(Entity*);
|
|
extern void (*const gUnk_080CE7C8[])(Entity*);
|
|
extern u8 gUnk_080CE7E0[];
|
|
extern u16 gUnk_080CE7F0[];
|
|
extern s8 gUnk_080CE810[];
|
|
|
|
u32 sub_080325E8(Entity* this);
|
|
void sub_08032650(Entity* this);
|
|
void sub_0803269C(Entity* this, u32 direction);
|
|
void sub_080326FC(Entity* this);
|
|
u32 sub_0803271C(Entity* this);
|
|
void sub_08032740(Entity* this);
|
|
void sub_0803275C(Entity* this);
|
|
void sub_08032784(Entity* this);
|
|
void sub_08032794(Entity* this);
|
|
void sub_080327C8(Entity* this);
|
|
void sub_080327E0(Entity* this);
|
|
|
|
void Keaton(Entity* this) {
|
|
EnemyFunctionHandler(this, gUnk_080CE7B0);
|
|
SetChildOffset(this, 0, 1, -18);
|
|
}
|
|
|
|
void sub_080323DC(Entity* this) {
|
|
gUnk_080CE7C8[this->action](this);
|
|
}
|
|
|
|
void sub_080323F4(Entity* this) {
|
|
u32 var;
|
|
|
|
if (this->action != 3 && this->action != 4) {
|
|
this->action = 3;
|
|
this->actionDelay = 0xC;
|
|
this->direction = DirectionTurnAround(DirectionRoundUp(this->knockbackDirection));
|
|
InitAnimationForceUpdate(this, this->direction >> 3);
|
|
} else if (this->bitfield == 0xCC) {
|
|
if (this->field_0x43 == 0) {
|
|
sub_0803275C(this);
|
|
}
|
|
}
|
|
if (this->field_0x43 != 0) {
|
|
sub_0804A9FC(this, 0x1C);
|
|
}
|
|
sub_0804AA30(this, gUnk_080CE7B0);
|
|
}
|
|
|
|
void nullsub_155(Entity* this) {
|
|
}
|
|
|
|
void sub_08032468(Entity* this) {
|
|
sub_0804A720(this);
|
|
this->animationState = 0;
|
|
InitAnimationForceUpdate(this, 0);
|
|
sub_080326FC(this);
|
|
sub_08032740(this);
|
|
}
|
|
|
|
void sub_0803248C(Entity* this) {
|
|
if (sub_080325E8(this) == 0) {
|
|
if (sub_0803271C(this) == 0) {
|
|
this->actionDelay--;
|
|
if (this->actionDelay == 0) {
|
|
sub_08032650(this);
|
|
}
|
|
if (ProcessMovement(this) == 0) {
|
|
this->actionDelay = 1;
|
|
}
|
|
UpdateAnimationSingleFrame(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_080324CC(Entity* this) {
|
|
if (sub_080325E8(this) == 0) {
|
|
UpdateAnimationSingleFrame(this);
|
|
if (this->frame & 0x80) {
|
|
sub_080326FC(this);
|
|
sub_08032740(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_080324FC(Entity* this) {
|
|
if (this->actionDelay != 0) {
|
|
this->actionDelay--;
|
|
if (this->actionDelay == 0) {
|
|
this->field_0xf = 0x1E;
|
|
this->animationState = this->direction / 8;
|
|
InitAnimationForceUpdate(this, this->animationState + 4);
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
UpdateAnimationSingleFrame(this);
|
|
UpdateAnimationSingleFrame(this);
|
|
this->field_0xf--;
|
|
if (this->field_0xf == 0) {
|
|
this->action = 4;
|
|
this->speed = 0x1E0;
|
|
this->field_0x76.HWORD = 0x46;
|
|
this->field_0x78.HWORD = 0;
|
|
*(((u8*)&this->field_0x7a) + 1) = 0;
|
|
sub_080327C8(this);
|
|
} else {
|
|
if ((this->field_0xf & 0x3) == 0) {
|
|
sub_08032794(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08032574(Entity* this) {
|
|
if (this->child && (this->child->bitfield & 0x80)) {
|
|
sub_0803275C(this);
|
|
return;
|
|
}
|
|
|
|
if (--this->field_0x76.HWORD == 0 || !sub_080AEFE0(this)) {
|
|
sub_0803275C(this);
|
|
return;
|
|
}
|
|
|
|
UpdateAnimationSingleFrame(this);
|
|
if ((this->field_0x76.HWORD & 0x7) == 0) {
|
|
sub_08032794(this);
|
|
}
|
|
}
|
|
|
|
void sub_080325C4(Entity* this) {
|
|
this->actionDelay--;
|
|
if ((this->actionDelay == 0) && (sub_080325E8(this) == 0)) {
|
|
sub_08032784(this);
|
|
}
|
|
}
|
|
|
|
u32 sub_080325E8(Entity* this) {
|
|
if (((sub_08049FA0(this) != 0) && (sub_08049FDC(this, 1) != 0)) &&
|
|
(EntityInRectRadius(this, gUnk_020000B0, 0x68, 0x40) != 0)) {
|
|
if (((GetFacingDirection(this, gUnk_020000B0) - (DirectionRound(this->frame)) + 2) & 0x1F) < 5) {
|
|
this->action = 3;
|
|
this->actionDelay = 0xC;
|
|
this->direction = DirectionRound(this->frame);
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void sub_08032650(Entity* this) {
|
|
u32 uVar3;
|
|
|
|
uVar3 = Random();
|
|
this->actionDelay = gUnk_080CE7E0[uVar3 & 0xf];
|
|
if (!((sub_08049FA0(this) == 0) && ((uVar3 >> 8 & 1) == 0))) {
|
|
this->direction = DirectionRound(uVar3 >> 0x10);
|
|
} else {
|
|
this->direction = DirectionRoundUp(sub_08049EE4(this));
|
|
}
|
|
sub_0803269C(this, this->direction);
|
|
}
|
|
|
|
void sub_0803269C(Entity* this, u32 direction) {
|
|
u32 uVar1;
|
|
|
|
if (((direction - 3) & 7) < 3) {
|
|
uVar1 = DirectionToAnimationState(direction);
|
|
if (((this->animationState - uVar1) & 3) > 1) {
|
|
this->animationState = uVar1;
|
|
InitAnimationForceUpdate(this, (this->animIndex & 0xFC) + uVar1);
|
|
}
|
|
} else {
|
|
uVar1 = DirectionToAnimationState(direction);
|
|
if (uVar1 != this->animationState) {
|
|
this->animationState = uVar1;
|
|
InitAnimationForceUpdate(this, (this->animIndex & 0xFC) + uVar1);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_080326FC(Entity* this) {
|
|
this->field_0x74.HWORD = gUnk_080CE7F0[Random() & 0xF];
|
|
}
|
|
|
|
u32 sub_0803271C(Entity* this) {
|
|
this->field_0x74.HWORD--;
|
|
if (this->field_0x74.HWORD == 0) {
|
|
sub_08032784(this);
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void sub_08032740(Entity* this) {
|
|
this->action = 1;
|
|
this->speed = 0x80;
|
|
InitializeAnimation(this, this->animationState);
|
|
sub_08032650(this);
|
|
}
|
|
|
|
void sub_0803275C(Entity* this) {
|
|
this->action = 5;
|
|
this->actionDelay = 0x2D;
|
|
this->speed = 0x80;
|
|
InitAnimationForceUpdate(this, this->animationState);
|
|
sub_0803269C(this, this->direction);
|
|
sub_080327E0(this);
|
|
}
|
|
|
|
void sub_08032784(Entity* this) {
|
|
this->action = 2;
|
|
InitAnimationForceUpdate(this, this->animationState + 8);
|
|
}
|
|
|
|
void sub_08032794(Entity* this) {
|
|
Entity* target;
|
|
s8* temp;
|
|
|
|
target = CreateFx(this, FX_DASH, 0x40);
|
|
if (target != NULL) {
|
|
temp = &gUnk_080CE810[this->animationState * 2];
|
|
PositionRelative(this, target, temp[0] << 0x10, temp[1] << 0x10);
|
|
}
|
|
}
|
|
|
|
void sub_080327C8(Entity* this) {
|
|
Entity* child;
|
|
|
|
child = CreateProjectileWithParent(this, 11, 0);
|
|
if (child != NULL) {
|
|
child->parent = this;
|
|
this->child = child;
|
|
}
|
|
}
|
|
|
|
void sub_080327E0(Entity* this) {
|
|
if (this->child != NULL) {
|
|
this->child->parent = NULL;
|
|
this->child = NULL;
|
|
}
|
|
}
|