mirror of https://github.com/zeldaret/tmc.git
85 lines
2.0 KiB
C
85 lines
2.0 KiB
C
/**
|
|
* @file iceProjectile.c
|
|
* @ingroup Projectiles
|
|
*
|
|
* @brief Ice Projectile
|
|
*/
|
|
#define NENT_DEPRECATED
|
|
#include "enemy.h"
|
|
#include "entity.h"
|
|
#include "functions.h"
|
|
|
|
extern void (*const IceProjectile_Actions[])(Entity*);
|
|
|
|
void IceProjectile(Entity* this) {
|
|
if (GetNextFunction(this) != 0) {
|
|
DeleteThisEntity();
|
|
}
|
|
IceProjectile_Actions[this->action](this);
|
|
}
|
|
|
|
void IceProjectile_Init(Entity* this) {
|
|
if (this->type == 0) {
|
|
this->action = 1;
|
|
InitializeAnimation(this, this->direction >> 3);
|
|
} else {
|
|
this->action = 2;
|
|
InitializeAnimation(this, this->direction >> 3 | IdleSouth);
|
|
EnqueueSFX(SFX_160);
|
|
}
|
|
}
|
|
|
|
void IceProjectile_Action1(Entity* this) {
|
|
u32 direction;
|
|
Entity* parent;
|
|
|
|
parent = this->parent;
|
|
if (parent == NULL) {
|
|
DeleteEntity(this);
|
|
} else {
|
|
if (parent->next == NULL) {
|
|
DeleteEntity(this);
|
|
} else {
|
|
if (this->spriteSettings.draw == 1) {
|
|
CopyPosition(parent, this);
|
|
if (this->timer != 0) {
|
|
direction = parent->direction & DirectionWest;
|
|
this->direction = direction;
|
|
this->timer = 0;
|
|
InitializeAnimation(this, direction >> 3);
|
|
}
|
|
}
|
|
GetNextFrame(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void IceProjectile_Action2(Entity* this) {
|
|
GetNextFrame(this);
|
|
if (ProcessMovement3(this) != 0) {
|
|
if (IsProjectileOffScreen(this)) {
|
|
DeleteEntity(this);
|
|
} else {
|
|
sub_08016AD2(this);
|
|
}
|
|
} else {
|
|
this->action = 3;
|
|
COLLISION_OFF(this);
|
|
this->speed = 0;
|
|
}
|
|
}
|
|
|
|
void IceProjectile_Action3(Entity* this) {
|
|
GetNextFrame(this);
|
|
if ((this->frame & ANIM_DONE) != 0) {
|
|
DeleteEntity(this);
|
|
}
|
|
}
|
|
|
|
void (*const IceProjectile_Actions[])(Entity*) = {
|
|
IceProjectile_Init,
|
|
IceProjectile_Action1,
|
|
IceProjectile_Action2,
|
|
IceProjectile_Action3,
|
|
};
|