mirror of
https://github.com/zeldaret/tmc
synced 2026-06-27 10:43:05 -04:00
207 lines
5.1 KiB
C
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 };
|