Files
tmc/src/projectile/stalfosProjectile.c
T
2021-12-25 21:28:44 -08:00

207 lines
5.1 KiB
C

#include "entity.h"
#include "enemy.h"
#include "functions.h"
#include "effects.h"
extern void (*const StalfosProjectile_Functions[])(Entity*);
extern void (*const StalfosProjectile_Actions[])(Entity*);
extern void (*const StalfosProjectile_SubActions[])(Entity*);
typedef struct {
s8 unk_0;
s8 unk_1;
s8 unk_2;
} PACKED struct_08129B20;
extern const struct_08129B20 gUnk_08129B20[];
extern const u8 gUnk_08129B50[];
void sub_080A9BA8(Entity*);
void sub_080A9BD0(Entity*);
void sub_080A9C34(Entity*);
void sub_080A9C50(Entity*);
void StalfosProjectile(Entity* this) {
StalfosProjectile_Functions[GetNextFunction(this)](this);
}
void StalfosProjectile_OnTick(Entity* this) {
StalfosProjectile_Actions[this->action](this);
}
void sub_080A9A34(Entity* this) {
if (this->bitfield == 0x9d) {
this->action = 3;
COLLISION_OFF(this);
this->zVelocity = 0x2a000;
this->spritePriority.b1 = 1;
}
}
void sub_080A9A64(Entity* this) {
if ((this->subAction < 3) && (sub_0806F520(this) == 0)) {
sub_080A9BA8(this);
}
StalfosProjectile_SubActions[this->subAction](this);
}
void StalfosProjectile_SubAction0(Entity* this) {
this->subAction = 2;
this->z.HALF.HI = 0xfffe;
}
void StalfosProjectile_SubAction1(Entity* this) {
sub_0806F4E8(this);
}
void StalfosProjectile_SubAction2(Entity* this) {
sub_0806F3E4(this);
}
void StalfosProjectile_SubAction3(Entity* this) {
COLLISION_OFF(this);
}
void StalfosProjectile_SubAction4(Entity* this) {
}
void StalfosProjectile_SubAction5(Entity* this) {
sub_080A9BA8(this);
}
void StalfosProjectile_Init(Entity* this) {
switch (this->type2) {
case 1:
this->action = 2;
COLLISION_ON(this);
break;
case 2:
this->action = 3;
this->zVelocity = 0x2a000;
this->spritePriority.b1 = 1;
break;
default:
this->action = 1;
break;
}
this->field_0x1c = 2;
if (this->type == 0) {
InitializeAnimation(this, 5);
} else {
this->frameIndex = 0;
}
}
void StalfosProjectile_Action1(Entity* this) {
if (this->parent->next == NULL) {
sub_080A9BA8(this);
}
if (this->parent->action == 0xb) {
sub_080A9BD0(this);
} else {
this->action = 2;
sub_080A9C34(this);
}
}
void StalfosProjectile_Action2(Entity* this) {
if (this->parent->next == NULL) {
sub_080A9BA8(this);
}
if (this->parent->action == 9) {
sub_080A9C34(this);
} else {
sub_080A9C50(this);
}
}
void StalfosProjectile_Action3(Entity* this) {
if (this->zVelocity < 0) {
this->spriteSettings.flipY = 1;
}
if (GravityUpdate(this, 0x2000) == 0) {
sub_080A9BA8(this);
}
}
void sub_080A9BA8(Entity* this) {
if (this->type == 0) {
CreateFx(this, FX_POT_SHATTER, 0);
} else {
CreateFx(this, FX_BONE, 0);
}
DeleteThisEntity();
}
void sub_080A9BD0(Entity* this) {
Entity* parent;
s32 tmp;
u32 tmp2;
const struct_08129B20* entry;
parent = this->parent;
switch (parent->animationState) {
case 0:
tmp = parent->frameIndex - 0x39;
break;
case 1:
case 3:
tmp = parent->frameIndex - 0x3d;
break;
case 2:
tmp = parent->frameIndex - 0x41;
break;
}
entry = &gUnk_08129B20[tmp + parent->animationState * 4];
sub_0806FA90(parent, this, entry->unk_0, entry->unk_1);
this->z.HALF.HI = entry->unk_2 + this->z.HALF.HI;
}
void sub_080A9C34(Entity* this) {
sub_0806FA90(this->parent, this, 0, 1);
this->spriteOffsetY -= 0xe;
}
void sub_080A9C50(Entity* this) {
Entity* parent;
u32 tmp;
parent = this->parent;
switch (parent->animationState) {
case 0:
tmp = 0xffffffd9 + parent->frameIndex;
break;
case 1:
case 3:
tmp = parent->frameIndex - 0x2d;
break;
case 2:
tmp = parent->frameIndex - 0x33;
break;
}
sub_0806FA90(parent, this, 0, 1);
this->spriteOffsetY += gUnk_08129B50[tmp];
}
void (*const StalfosProjectile_Functions[])(Entity*) = {
StalfosProjectile_OnTick, sub_080A9A34, DeleteEntity, DeleteEntity, DeleteEntity, sub_080A9A64,
};
void (*const StalfosProjectile_Actions[])(Entity*) = {
StalfosProjectile_Init,
StalfosProjectile_Action1,
StalfosProjectile_Action2,
StalfosProjectile_Action3,
};
void (*const StalfosProjectile_SubActions[])(Entity*) = {
StalfosProjectile_SubAction0, StalfosProjectile_SubAction1, StalfosProjectile_SubAction2,
StalfosProjectile_SubAction3, StalfosProjectile_SubAction4, StalfosProjectile_SubAction5,
};
const struct_08129B20 gUnk_08129B20[] = {
{ 0, -9, -1 }, { 0, 5, -25 }, { 0, 3, -20 }, { 0, 0, -14 }, { 10, 0, -1 }, { -5, 0, -24 },
{ -3, 0, -20 }, { 0, 0, -13 }, { 0, 5, -1 }, { 0, -5, -19 }, { 0, -3, -16 }, { 0, 0, -11 },
{ -10, 0, -1 }, { 5, 0, -24 }, { 3, 0, -20 }, { 0, 0, -13 },
};
const u8 gUnk_08129B50[] = { 241, 243, 242, 241, 243, 242, 0, 0 };