mirror of https://github.com/zeldaret/tmc.git
111 lines
2.7 KiB
C
111 lines
2.7 KiB
C
/**
|
|
* @file miniSlime.c
|
|
* @ingroup Enemies
|
|
*
|
|
* @brief Mini Slime enemy
|
|
*/
|
|
|
|
#include "enemy.h"
|
|
#include "physics.h"
|
|
|
|
void sub_08045374(Entity*);
|
|
void MiniSlime_OnTick(Entity*);
|
|
void MiniSlime_OnCollision(Entity*);
|
|
void MiniSlime_OnDeath(Entity*);
|
|
void MiniSlime_OnGrabbed(Entity*);
|
|
void sub_080452A4(Entity*);
|
|
void sub_080452E4(Entity*);
|
|
void sub_080452FC(Entity*);
|
|
void sub_08045374(Entity*);
|
|
|
|
extern void sub_080452E4(Entity*);
|
|
extern void ReplaceMonitoredEntity(Entity*, Entity*);
|
|
|
|
static void (*const MiniSlime_Functions[])(Entity*) = {
|
|
MiniSlime_OnTick, MiniSlime_OnCollision, GenericKnockback, MiniSlime_OnDeath, GenericConfused, MiniSlime_OnGrabbed,
|
|
};
|
|
|
|
void MiniSlime(Entity* this) {
|
|
EnemyFunctionHandler(this, MiniSlime_Functions);
|
|
SetChildOffset(this, 0, 1, -8);
|
|
}
|
|
|
|
void MiniSlime_OnTick(Entity* this) {
|
|
static void (*const actionFuncs[])(Entity*) = {
|
|
sub_080452A4,
|
|
sub_080452E4,
|
|
sub_080452FC,
|
|
sub_08045374,
|
|
};
|
|
actionFuncs[this->action](this);
|
|
}
|
|
|
|
void MiniSlime_OnCollision(Entity* this) {
|
|
if (this->confusedTime)
|
|
Create0x68FX(this, FX_STARS);
|
|
|
|
EnemyFunctionHandlerAfterCollision(this, MiniSlime_Functions);
|
|
}
|
|
|
|
void MiniSlime_OnDeath(Entity* this) {
|
|
Entity* parent = this->parent;
|
|
if ((this != parent) && (parent != NULL)) {
|
|
this->field_0x6c.HALF.LO &= 0x7f;
|
|
this->parent->child = this->child;
|
|
this->child->parent = this->parent;
|
|
if (this->field_0x6c.HALF.HI & 0x40)
|
|
ReplaceMonitoredEntity(this, parent);
|
|
}
|
|
GenericDeath(this);
|
|
}
|
|
|
|
void MiniSlime_OnGrabbed(Entity* this) {
|
|
}
|
|
|
|
void sub_080452A4(Entity* this) {
|
|
this->action = 1;
|
|
this->spriteSettings.draw = 1;
|
|
this->speed = 0x100;
|
|
sub_0804A720(this);
|
|
InitializeAnimation(this, 6);
|
|
if (this->type2) {
|
|
this->action = 2;
|
|
this->timer = 1;
|
|
} else {
|
|
sub_080452E4(this);
|
|
}
|
|
}
|
|
|
|
void sub_080452E4(Entity* this) {
|
|
this->action = 2;
|
|
this->timer = (Random() & 0x1f) + 1;
|
|
}
|
|
|
|
void sub_080452FC(Entity* this) {
|
|
u32 cVar2, bVar3;
|
|
GetNextFrame(this);
|
|
if (--this->timer == 0) {
|
|
this->action = 3;
|
|
this->timer = 1;
|
|
if (0 < this->speed)
|
|
this->timer = FixedDiv(0x1000, this->speed) >> 8;
|
|
|
|
if (sub_08049FA0(this) == 0 && (Random() & 3)) {
|
|
cVar2 = sub_08049EE4(this);
|
|
bVar3 = Random() & 8;
|
|
bVar3 += 0xfc;
|
|
this->direction = DirectionRound(cVar2 + bVar3);
|
|
} else {
|
|
this->direction = DirectionRound(Random());
|
|
sub_08045374(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08045374(Entity* this) {
|
|
ProcessMovement0(this);
|
|
GetNextFrame(this);
|
|
if (--this->timer == 0)
|
|
this->action = 1;
|
|
}
|