Files
tmc/src/enemy/gyorgFemaleEye.c
T
2022-03-28 20:10:22 -07:00

211 lines
7.3 KiB
C

#define NENT_DEPRECATED
#include "global.h"
#include "entity.h"
#include "enemy.h"
#include "player.h"
#include "functions.h"
#include "enemy/gyorg.h"
void GyorgFemaleEye_OnTick(GyorgFemaleEyeEntity*);
void GyorgFemaleEye_OnCollision(GyorgFemaleEyeEntity*);
void sub_08048AF0(GyorgFemaleEyeEntity*);
void sub_08048B2C(GyorgFemaleEyeEntity*);
void sub_08048B84(GyorgFemaleEyeEntity*);
void sub_08048BB0(GyorgFemaleEyeEntity*);
void sub_08048CEC(GyorgFemaleEyeEntity*);
void sub_08048D20(GyorgFemaleEyeEntity*);
u32 sub_08048D70(GyorgFemaleEntity*);
void (*const GyorgFemaleEye_Functions[])(GyorgFemaleEyeEntity*) = {
GyorgFemaleEye_OnTick,
GyorgFemaleEye_OnCollision,
(void (*)(GyorgFemaleEyeEntity*))GenericKnockback,
(void (*)(GyorgFemaleEyeEntity*))GenericDeath,
(void (*)(GyorgFemaleEyeEntity*))GenericConfused,
GyorgFemaleEye_OnTick,
};
void GyorgFemaleEye(Entity* this) {
if (this->parent->next == NULL) {
DeleteThisEntity();
}
GyorgFemaleEye_Functions[GetNextFunction(this)]((GyorgFemaleEyeEntity*)this);
}
void GyorgFemaleEye_OnTick(GyorgFemaleEyeEntity* this) {
static void (*const gUnk_080D1F7C[])(GyorgFemaleEyeEntity*) = {
sub_08048AF0, sub_08048B2C, sub_08048B84, sub_08048BB0, sub_08048CEC,
};
gUnk_080D1F7C[super->action](this);
}
typedef struct {
u16 x, y;
} xy;
const xy gUnk_080D1F90[] = {
{ 0x1e8, 0x1d8 }, { 0x1f8, 0x1d8 }, { 0x208, 0x1d8 }, { 0x218, 0x1d8 }, { 0x1e8, 0x1e8 }, { 0x1f8, 0x1e8 },
{ 0x208, 0x1e8 }, { 0x218, 0x1e8 }, { 0x238, 0x1f8 }, { 0x238, 0x208 }, { 0x238, 0x218 }, { 0x238, 0x228 },
{ 0x228, 0x1f8 }, { 0x228, 0x208 }, { 0x228, 0x218 }, { 0x228, 0x228 }, { 0x218, 0x248 }, { 0x208, 0x248 },
{ 0x1f8, 0x248 }, { 0x1e8, 0x248 }, { 0x218, 0x238 }, { 0x208, 0x238 }, { 0x1f8, 0x238 }, { 0x1e8, 0x238 },
{ 0x1c8, 0x228 }, { 0x1c8, 0x218 }, { 0x1c8, 0x208 }, { 0x1c8, 0x1f8 }, { 0x1d8, 0x228 }, { 0x1d8, 0x218 },
{ 0x1d8, 0x208 }, { 0x1d8, 0x1f8 },
};
const u8 gUnk_080D2010[] = {
0, 0, 1, 1, 0, 0, 1, 1, 4, 4, 5, 5, 4, 4, 5, 5, 9, 9, 8, 8, 9, 9, 8, 8, 13, 13, 12, 12, 13, 13, 12, 12,
};
const u8 gUnk_080D2030[] = {
2, 2, 3, 3, 2, 2, 3, 3, 6, 6, 7, 7, 6, 6, 7, 7, 11, 11, 10, 10, 11, 11, 10, 10, 15, 15, 14, 14, 15, 15, 14, 14,
};
void GyorgFemaleEye_OnCollision(GyorgFemaleEyeEntity* this) {
GyorgFemaleEntity* parent;
if (super->health != 0xFF) {
parent = (GyorgFemaleEntity*)super->parent;
#ifndef EU
if ((parent->eyesVulnerable >> super->type) & 1) {
#endif
parent->eyesHitFrame |= (1 << super->type);
#ifndef EU
switch (super->contactFlags & 0x7F) {
case 4 ... 6:
case 8 ... 13:
case 16 ... 18:
case 24 ... 26:
#endif
(*(((GyorgHeap**)&parent->base.myHeap)))->unk_18[super->type] = super->contactedEntity;
(*(((GyorgHeap**)&parent->base.myHeap)))->reflectFxPos.HALF.x =
(gPlayerEntity.x.HALF.HI + super->x.HALF.HI) / 2;
(*(((GyorgHeap**)&parent->base.myHeap)))->reflectFxPos.HALF.y =
(gPlayerEntity.y.HALF.HI + super->y.HALF.HI) / 2;
(*(((GyorgHeap**)&parent->base.myHeap)))->unk_3c = (super->knockbackDirection ^= 0x10);
#ifndef EU
break;
default:
((GyorgHeap*)parent->base.myHeap)->unk_3c = 0xFF;
break;
}
}
#endif
}
super->health = 0xFF;
EnemyFunctionHandlerAfterCollision(super, (void (*const*)(Entity*))GyorgFemaleEye_Functions);
}
void sub_08048AF0(GyorgFemaleEyeEntity* this) {
super->action = 1;
super->animationState = 0xFF;
super->spriteOrientation.flipY = 2;
super->spriteRendering.b3 = 2;
super->spritePriority.b0 = 7;
super->collisionLayer = 2;
sub_08048D20(this);
}
void sub_08048B2C(GyorgFemaleEyeEntity* this) {
GyorgFemaleEntity* parent;
sub_08048D20(this);
parent = (GyorgFemaleEntity*)super->parent;
if (sub_08048D70(parent)) {
if (!super->spriteSettings.draw) {
CreateFx(super, FX_DEATH, 0x40);
}
super->spriteSettings.draw = 1;
} else {
super->spriteSettings.draw = 0;
}
if ((parent->eyesVulnerable >> super->type) & 1) {
super->action = 2;
}
}
void sub_08048B84(GyorgFemaleEyeEntity* this) {
GetNextFrame(super);
if (super->frame & ANIM_DONE) {
super->action = 3;
super->flags |= ENT_COLLIDE;
super->hitType = 0x1E;
}
}
void sub_08048BB0(GyorgFemaleEyeEntity* this) {
GyorgFemaleEntity* parent = (GyorgFemaleEntity*)super->parent;
if (!((parent->eyesVulnerable >> super->type) & 1)) {
if (parent->base.health != 0) {
super->action = 4;
super->flags &= ~ENT_COLLIDE;
InitializeAnimation(super, gUnk_080D2030[(super->animationState << 3) + super->type]);
} else {
super->action = 1;
super->flags &= ~ENT_COLLIDE;
super->spriteSettings.draw = 0;
InitializeAnimation(super, gUnk_080D2010[(super->animationState << 3) + super->type]);
CreateFx(super, FX_DEATH, 0x40);
}
} else {
if ((parent->unk_80 >> super->type) & 1) {
if (super->animIndex <= 0x13) {
super->iframes = 0xF4;
super->hitType = 0x89;
InitializeAnimation(super, (parent->base.animationState >> 6) + 0x14);
SoundReq(SFX_ITEM_GLOVES_KNOCKBACK);
}
GetNextFrame(super);
if (super->frame & ANIM_DONE) {
super->hitType = 0x1E;
InitializeAnimation(super, gUnk_080D2010[(super->animationState << 3) + super->type]);
UpdateAnimationVariableFrames(super, 7);
parent->unk_80 &= ~(1 << super->type);
}
} else {
if (parent->eyesVulnerable == 0xFF) {
u32 tmp = super->animIndex;
if (tmp < 0x10 || tmp > 0x13) {
InitializeAnimation(super, super->animationState + 0x10);
UpdateAnimationVariableFrames(super, Random() & 0x1C);
}
GetNextFrame(super);
}
}
}
}
void sub_08048CEC(GyorgFemaleEyeEntity* this) {
GetNextFrame(super);
if (super->frame & ANIM_DONE) {
super->action = 1;
InitializeAnimation(super, gUnk_080D2010[(super->animationState << 3) + super->type]);
}
}
void sub_08048D20(GyorgFemaleEyeEntity* this) {
GyorgFemaleEntity* parent = (GyorgFemaleEntity*)super->parent;
const xy* tmp;
u32 tmp2 = (parent->base.animationState >> 6);
if (tmp2 != super->animationState) {
super->animationState = tmp2;
tmp = &gUnk_080D1F90[super->type + (tmp2 << 3)];
super->x.HALF.HI = tmp->x + gRoomControls.origin_x;
super->y.HALF.HI = tmp->y + gRoomControls.origin_y;
InitializeAnimation(super, gUnk_080D2010[super->type + (tmp2 << 3)]);
}
}
u32 sub_08048D70(GyorgFemaleEntity* parent) {
GyorgMaleEntity* tmp;
if (parent->base.health != 0) {
return 1;
}
tmp = ((GyorgHeap*)parent->base.myHeap)->male1;
if (!tmp) {
tmp = ((GyorgHeap*)parent->base.myHeap)->male2;
}
if (tmp->base.health != 0) {
return 0;
}
return 1;
}