Shipwright/soh/src/overlays/actors/ovl_En_Bigokuta/z_en_bigokuta.c

902 lines
32 KiB
C

#include "z_en_bigokuta.h"
#include "objects/object_bigokuta/object_bigokuta.h"
#define FLAGS (ACTOR_FLAG_0 | ACTOR_FLAG_2 | ACTOR_FLAG_4 | ACTOR_FLAG_5)
void EnBigokuta_Init(Actor* thisx, GlobalContext* globalCtx);
void EnBigokuta_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnBigokuta_Update(Actor* thisx, GlobalContext* globalCtx);
void EnBigokuta_Draw(Actor* thisx, GlobalContext* globalCtx);
void func_809BD318(EnBigokuta* this);
void func_809BD3E0(EnBigokuta* this);
void func_809BDF34(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BD84C(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BD8DC(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BDAE8(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BDB90(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BDC08(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BE3E4(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BE4A4(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BE518(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BCF68(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BDFC8(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BE26C(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BE180(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BE058(EnBigokuta* this, GlobalContext* globalCtx);
void func_809BD1C8(EnBigokuta* this, GlobalContext* globalCtx);
static Color_RGBA8 sEffectPrimColor = { 255, 255, 255, 255 };
static Color_RGBA8 sEffectEnvColor = { 100, 255, 255, 255 };
static Vec3f sEffectPosAccel = { 0.0f, 0.0f, 0.0f };
const ActorInit En_Bigokuta_InitVars = {
ACTOR_EN_BIGOKUTA,
ACTORCAT_ENEMY,
FLAGS,
OBJECT_BIGOKUTA,
sizeof(EnBigokuta),
(ActorFunc)EnBigokuta_Init,
(ActorFunc)EnBigokuta_Destroy,
(ActorFunc)EnBigokuta_Update,
(ActorFunc)EnBigokuta_Draw,
NULL,
};
static ColliderJntSphElementInit sJntSphElementInit[1] = {
{
{
ELEMTYPE_UNK1,
{ 0x20000000, 0x00, 0x08 },
{ 0xFFCFFFFF, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_HARD,
BUMP_ON,
OCELEM_ON,
},
{ 1, { { 0, 45, -30 }, 75 }, 100 },
},
};
static ColliderJntSphInit sJntSphInit = {
{
COLTYPE_HIT0,
AT_ON | AT_TYPE_ENEMY,
AC_ON | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_JNTSPH,
},
ARRAY_COUNT(sJntSphElementInit),
sJntSphElementInit,
};
static ColliderCylinderInit sCylinderInit[] = {
{ {
COLTYPE_HARD,
AT_ON | AT_TYPE_ENEMY,
AC_ON | AC_HARD | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK1,
{ 0x20000000, 0x00, 0x08 },
{ 0xFFCFFFE7, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_HARD,
BUMP_ON,
OCELEM_ON,
},
{ 50, 100, 0, { 30, 0, 12 } } },
{ {
COLTYPE_HARD,
AT_ON | AT_TYPE_ENEMY,
AC_ON | AC_HARD | AC_TYPE_PLAYER,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_CYLINDER,
},
{
ELEMTYPE_UNK1,
{ 0x20000000, 0x00, 0x08 },
{ 0xFFCFFFE7, 0x00, 0x00 },
TOUCH_ON | TOUCH_SFX_HARD,
BUMP_ON,
OCELEM_ON,
},
{ 50, 100, 0, { -30, 0, 12 } } },
};
static CollisionCheckInfoInit sColChkInfoInit[] = { 4, 130, 120, 200 };
static DamageTable sDamageTable = {
/* Deku nut */ DMG_ENTRY(0, 0x1),
/* Deku stick */ DMG_ENTRY(2, 0x0),
/* Slingshot */ DMG_ENTRY(0, 0x0),
/* Explosive */ DMG_ENTRY(0, 0xF),
/* Boomerang */ DMG_ENTRY(0, 0x1),
/* Normal arrow */ DMG_ENTRY(0, 0x0),
/* Hammer swing */ DMG_ENTRY(0, 0x0),
/* Hookshot */ DMG_ENTRY(0, 0x0),
/* Kokiri sword */ DMG_ENTRY(1, 0x0),
/* Master sword */ DMG_ENTRY(0, 0x0),
/* Giant's Knife */ DMG_ENTRY(0, 0x0),
/* Fire arrow */ DMG_ENTRY(0, 0x0),
/* Ice arrow */ DMG_ENTRY(0, 0x0),
/* Light arrow */ DMG_ENTRY(0, 0x0),
/* Unk arrow 1 */ DMG_ENTRY(0, 0x0),
/* Unk arrow 2 */ DMG_ENTRY(0, 0x0),
/* Unk arrow 3 */ DMG_ENTRY(0, 0x0),
/* Fire magic */ DMG_ENTRY(0, 0x0),
/* Ice magic */ DMG_ENTRY(0, 0x0),
/* Light magic */ DMG_ENTRY(0, 0x0),
/* Shield */ DMG_ENTRY(0, 0x0),
/* Mirror Ray */ DMG_ENTRY(0, 0x0),
/* Kokiri spin */ DMG_ENTRY(1, 0x0),
/* Giant spin */ DMG_ENTRY(0, 0x0),
/* Master spin */ DMG_ENTRY(0, 0x0),
/* Kokiri jump */ DMG_ENTRY(2, 0x0),
/* Giant jump */ DMG_ENTRY(0, 0x0),
/* Master jump */ DMG_ENTRY(4, 0x0),
/* Unknown 1 */ DMG_ENTRY(0, 0x0),
/* Unblockable */ DMG_ENTRY(0, 0x0),
/* Hammer jump */ DMG_ENTRY(0, 0x0),
/* Unknown 2 */ DMG_ENTRY(0, 0x0),
};
static InitChainEntry sInitChain[] = {
ICHAIN_F32(targetArrowOffset, 2000, ICHAIN_CONTINUE),
ICHAIN_U8(targetMode, 2, ICHAIN_CONTINUE),
ICHAIN_F32(gravity, -1, ICHAIN_CONTINUE),
ICHAIN_S8(naviEnemyId, 0x59, ICHAIN_CONTINUE),
ICHAIN_VEC3F_DIV1000(scale, 33, ICHAIN_STOP),
};
// possibly color data
static s32 sUnused[] = { 0xFFFFFFFF, 0x969696FF };
void EnBigokuta_Init(Actor* thisx, GlobalContext* globalCtx) {
EnBigokuta* this = (EnBigokuta*)thisx;
s32 i;
Actor_ProcessInitChain(&this->actor, sInitChain);
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_bigokuta_Skel_006BC0, &object_bigokuta_Anim_0014B8,
this->jointTable, this->morphTable, 20);
Collider_InitJntSph(globalCtx, &this->collider);
Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sJntSphInit, &this->element);
this->collider.elements->dim.worldSphere.radius = this->collider.elements->dim.modelSphere.radius;
for (i = 0; i < ARRAY_COUNT(sCylinderInit); i++) {
Collider_InitCylinder(globalCtx, &this->cylinder[i]);
Collider_SetCylinder(globalCtx, &this->cylinder[i], &this->actor, &sCylinderInit[i]);
}
CollisionCheck_SetInfo(&this->actor.colChkInfo, &sDamageTable, sColChkInfoInit);
this->unk_194 = 1;
if (this->actor.params == 0) {
Actor_ChangeCategory(globalCtx, &globalCtx->actorCtx, &this->actor, ACTORCAT_PROP);
func_809BD318(this);
} else {
func_809BD3E0(this);
this->unk_19A = 0;
this->unk_196 = 1;
this->actor.home.pos.y = -1025.0f;
}
}
void EnBigokuta_Destroy(Actor* thisx, GlobalContext* globalCtx) {
EnBigokuta* this = (EnBigokuta*)thisx;
s32 i;
Collider_DestroyJntSph(globalCtx, &this->collider);
for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) {
Collider_DestroyCylinder(globalCtx, &this->cylinder[i]);
}
}
void func_809BCE3C(EnBigokuta* this) {
this->actor.world.rot.y = this->actor.shape.rot.y + this->unk_194 * -0x4000;
this->actor.world.pos.x = Math_SinS(this->actor.world.rot.y) * 263.0f + this->actor.home.pos.x;
this->actor.world.pos.z = Math_CosS(this->actor.world.rot.y) * 263.0f + this->actor.home.pos.z;
}
void func_809BCEBC(EnBigokuta* this, GlobalContext* globalCtx) {
Vec3f pos;
f32 yDistFromHome = this->actor.world.pos.y - this->actor.home.pos.y;
pos.x = this->actor.world.pos.x;
pos.y = this->actor.home.pos.y + 3.0f;
pos.z = this->actor.world.pos.z;
if (((globalCtx->gameplayFrames % 7) == 0) && (yDistFromHome <= 0.0f) && (yDistFromHome > -100.0f)) {
EffectSsGRipple_Spawn(globalCtx, &pos, 800, 1300, 0);
}
}
void func_809BCF68(EnBigokuta* this, GlobalContext* globalCtx) {
Vec3f effectPos;
s16 rot;
if (globalCtx->gameplayFrames & 1) {
rot = Rand_S16Offset(0x1200, 0xC00) + this->actor.shape.rot.y - this->unk_194 * 0xA00;
} else {
rot = this->actor.shape.rot.y - this->unk_194 * 0xA00 - Rand_S16Offset(0x1200, 0xC00);
}
if (this->actionFunc != func_809BE4A4) {
if (this->actionFunc == func_809BE3E4 || (globalCtx->gameplayFrames & 2)) {
effectPos.x = this->actor.world.pos.x - Math_SinS(rot) * 80.0f;
effectPos.z = this->actor.world.pos.z - Math_CosS(rot) * 80.0f;
effectPos.y = this->actor.home.pos.y + 1.0f;
EffectSsGRipple_Spawn(globalCtx, &effectPos, 100, 500, 0);
} else {
effectPos.x = this->actor.world.pos.x - Math_SinS(rot) * 120.0f;
effectPos.z = this->actor.world.pos.z - Math_CosS(rot) * 120.0f;
effectPos.y = this->actor.home.pos.y + 5.0f;
}
} else {
effectPos.x = this->actor.world.pos.x - Math_SinS(rot) * 50.0f;
effectPos.z = this->actor.world.pos.z - Math_CosS(rot) * 50.0f;
effectPos.y = this->actor.home.pos.y + 1.0f;
EffectSsGRipple_Spawn(globalCtx, &effectPos, 100, 500, 0);
}
EffectSsGSplash_Spawn(globalCtx, &effectPos, NULL, NULL, 1, 800);
if (this->actionFunc != func_809BE4A4) {
func_8002F974(&this->actor, NA_SE_EN_DAIOCTA_SPLASH - SFX_FLAG);
}
}
void func_809BD1C8(EnBigokuta* this, GlobalContext* globalCtx) {
s32 i;
Vec3f effectPos;
effectPos.y = this->actor.world.pos.y;
for (i = 0; i < 4; i++) {
effectPos.x = ((i >= 2) ? 1 : -1) * 60.0f + this->actor.world.pos.x;
effectPos.z = ((i & 1) ? 1 : -1) * 60.0f + this->actor.world.pos.z;
EffectSsGSplash_Spawn(globalCtx, &effectPos, NULL, NULL, 1, 2000);
}
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_LAND_WATER);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_GOLON_LAND_BIG);
func_80033E88(&this->actor, globalCtx, 0xA, 8);
}
void func_809BD2E4(EnBigokuta* this) {
Actor* parent = this->actor.parent;
if (parent != NULL) {
Math_ScaledStepToS(&parent->world.rot.y, this->unk_19A, 0x10);
}
}
void func_809BD318(EnBigokuta* this) {
Animation_PlayLoop(&this->skelAnime, &object_bigokuta_Anim_0014B8);
this->unk_19A = 0;
this->actor.home.pos.y = -1025.0f;
this->unk_196 = 121;
this->actionFunc = func_809BD84C;
}
void func_809BD370(EnBigokuta* this) {
this->unk_196 = 21;
Audio_PlayActorSound2(&this->actor, NA_SE_EN_STAL_JUMP);
this->actionFunc = func_809BD8DC;
}
void func_809BD3AC(EnBigokuta* this) {
this->actor.world.pos.x = this->actor.home.pos.x + 263.0f;
this->unk_196 = 10;
this->actionFunc = func_809BDAE8;
this->actor.world.pos.y = this->actor.home.pos.y;
}
void func_809BD3E0(EnBigokuta* this) {
this->unk_196 = 40;
this->actionFunc = func_809BDB90;
}
void func_809BD3F8(EnBigokuta* this) {
Animation_MorphToLoop(&this->skelAnime, &object_bigokuta_Anim_001CA4, -5.0f);
this->unk_196 = 350;
this->unk_198 = 80;
this->unk_19A = this->unk_194 * -0x200;
func_809BCE3C(this);
this->cylinder[0].base.atFlags |= AT_ON;
this->collider.base.acFlags |= AC_ON;
this->actionFunc = func_809BDC08;
}
void func_809BD47C(EnBigokuta* this) {
this->unk_196 = 16;
this->collider.base.acFlags &= ~AC_ON;
this->actor.colorFilterTimer = 0;
this->actionFunc = func_809BDF34;
}
void func_809BD4A4(EnBigokuta* this) {
Animation_MorphToLoop(&this->skelAnime, &object_bigokuta_Anim_0014B8, -5.0f);
this->unk_195 = true;
this->actor.world.rot.x = this->actor.shape.rot.y + 0x8000;
this->unk_19A = this->unk_194 * 0x200;
this->collider.base.acFlags &= ~AC_ON;
this->cylinder[0].base.atFlags |= AT_ON;
this->actionFunc = func_809BDFC8;
}
void func_809BD524(EnBigokuta* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_bigokuta_Anim_000D1C, -5.0f);
this->unk_196 = 80;
this->unk_19A = 0;
this->cylinder[0].base.atFlags |= AT_ON;
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_MAHI);
if (this->collider.elements->info.acHitInfo->toucher.dmgFlags & 1) {
this->unk_195 = true;
this->unk_196 = 20;
} else {
this->unk_195 = false;
this->unk_196 = 80;
}
Actor_SetColorFilter(&this->actor, 0, 255, 0, this->unk_196);
this->actionFunc = func_809BE058;
}
void func_809BD5E0(EnBigokuta* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_bigokuta_Anim_000444, -5.0f);
this->unk_196 = 24;
this->unk_19A = 0;
this->cylinder[0].base.atFlags &= ~AT_ON;
Actor_SetColorFilter(&this->actor, 0x4000, 255, 0, 24);
this->actionFunc = func_809BE180;
}
void func_809BD658(EnBigokuta* this) {
Animation_MorphToPlayOnce(&this->skelAnime, &object_bigokuta_Anim_000A74, -5.0f);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_DEAD2);
this->unk_196 = 38;
this->unk_198 = 10;
this->actionFunc = func_809BE26C;
}
void func_809BD6B8(EnBigokuta* this) {
if (!this->unk_195) {
if (Rand_ZeroOne() < 0.5f) {
this->unk_196 = 24;
} else {
this->unk_196 = 28;
}
} else {
if (ABS(this->actor.shape.rot.y - this->actor.yawTowardsPlayer) >= 0x4000) {
this->unk_196 = 4;
} else {
this->unk_196 = 0;
}
}
this->unk_19A = 0;
this->collider.base.acFlags &= ~AC_ON;
this->actionFunc = func_809BE3E4;
}
void func_809BD768(EnBigokuta* this) {
this->unk_194 = Rand_ZeroOne() < 0.5f ? -1 : 1;
this->unk_19A = 0;
this->actor.flags &= ~ACTOR_FLAG_0;
this->cylinder[0].base.atFlags &= ~AT_ON;
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_SINK);
this->actionFunc = func_809BE4A4;
}
void func_809BD7F0(EnBigokuta* this, GlobalContext* globalCtx) {
this->actor.world.rot.y = Actor_WorldYawTowardPoint(&GET_PLAYER(globalCtx)->actor, &this->actor.home.pos);
this->actor.shape.rot.y = this->actor.world.rot.y + (this->unk_194 * 0x4000);
func_809BCE3C(this);
this->actionFunc = func_809BE518;
}
void func_809BD84C(EnBigokuta* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
this->unk_196--;
if (this->unk_196 == 13 || this->unk_196 == -20) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_VOICE);
}
if (this->unk_196 == 1) {
func_800F5ACC(NA_BGM_MINI_BOSS);
}
if (this->actor.params == 1) {
func_809BD370(this);
}
}
void func_809BD8DC(EnBigokuta* this, GlobalContext* globalCtx) {
Vec3f effectPos;
this->unk_196--;
if (this->unk_196 >= 0) {
Math_StepToF(&this->actor.world.pos.x, this->actor.home.pos.x + 263.0f, 263.0f / 21);
if (this->unk_196 < 14) {
this->actor.world.pos.y = sinf(this->unk_196 * (M_PI / 28)) * 200.0f + this->actor.home.pos.y;
} else {
this->actor.world.pos.y =
sinf((this->unk_196 - 7) * (M_PI / 14)) * 130.0f + (this->actor.home.pos.y + 70.0f);
}
if (this->unk_196 == 0) {
effectPos.x = this->actor.world.pos.x + 40.0f;
effectPos.y = this->actor.world.pos.y;
effectPos.z = this->actor.world.pos.z - 70.0f;
EffectSsGSplash_Spawn(globalCtx, &effectPos, NULL, NULL, 1, 2000);
effectPos.x = this->actor.world.pos.x - 40.0f;
EffectSsGSplash_Spawn(globalCtx, &effectPos, NULL, NULL, 1, 2000);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_LAND_WATER);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_GOLON_LAND_BIG);
func_800AA000(0.0f, 0xFF, 0x14, 0x96);
}
} else if (this->unk_196 < -1) {
this->actor.world.pos.y = this->actor.home.pos.y - (sinf((this->unk_196 + 1) * (M_PI / 10)) * 20.0f);
if (this->unk_196 == -10) {
func_809BD3AC(this);
}
}
}
void func_809BDAE8(EnBigokuta* this, GlobalContext* globalCtx) {
if (Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.home.rot.y + 0x4000, 0x400)) {
if (this->unk_196 != 0) {
this->unk_196--;
}
if (this->unk_196 == 0) {
func_809BCE3C(this);
this->actor.home.pos.y = this->actor.world.pos.y;
Actor_ChangeCategory(globalCtx, &globalCtx->actorCtx, &this->actor, ACTORCAT_ENEMY);
this->actor.params = 2;
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_VOICE);
func_809BD3E0(this);
}
}
}
void func_809BDB90(EnBigokuta* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
if (this->unk_196 != 0) {
this->unk_196--;
}
if (this->unk_196 == 0) {
if (this->actor.params == 3) {
func_800F5ACC(NA_BGM_MINI_BOSS);
}
func_809BD3F8(this);
}
}
void func_809BDC08(EnBigokuta* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
s16 phi_v0;
s16 pad;
s16 phi_v1;
Vec3f sp28;
SkelAnime_Update(&this->skelAnime);
if (Animation_OnFrame(&this->skelAnime, 0.0f)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_OCTAROCK_BUBLE);
}
if (this->unk_196 < 0) {
this->actor.shape.rot.y += this->unk_194 * 0x200;
func_809BCE3C(this);
this->unk_196++;
if (this->unk_196 == 0) {
this->unk_196 = 350;
}
func_809BCF68(this, globalCtx);
return;
}
phi_v1 = (Actor_WorldDistXZToPoint(&player->actor, &this->actor.home.pos) - 180.0f) * (8.0f / 15);
func_8002DBD0(&this->actor, &sp28, &player->actor.world.pos);
if (fabsf(sp28.x) > 263.0f || ((sp28.z > 0.0f) && !Actor_IsFacingPlayer(&this->actor, 0x1B00) &&
!Player_IsFacingActor(&this->actor, 0x2000, globalCtx))) {
phi_v1 -= 0x80;
if (this->unk_196 != 0) {
this->unk_196--;
}
}
if ((this->actor.xzDistToPlayer < 250.0f) && !Actor_IsFacingPlayer(&this->actor, 0x6000)) {
if (this->unk_198 != 0) {
this->unk_198--;
}
if (this->actor.xzDistToPlayer < 180.0f) {
phi_v1 += 0x20;
}
} else {
this->unk_198 = 80;
}
if (this->actor.colChkInfo.health == 1) {
phi_v1 = (phi_v1 + 0x130) * 1.1f;
} else {
phi_v1 += 0x130;
}
this->actor.shape.rot.y += phi_v1 * this->unk_194;
func_809BCE3C(this);
func_809BCF68(this, globalCtx);
if (this->unk_198 == 0) {
func_809BD768(this);
} else if (this->unk_196 == 0) {
func_809BD4A4(this);
} else if (this->unk_195) {
phi_v0 = this->actor.yawTowardsPlayer - this->actor.shape.rot.y;
if (phi_v0 < 0) {
phi_v0 = -phi_v0;
}
if (phi_v0 < 0x4100 && phi_v0 > 0x3F00) {
if (Rand_ZeroOne() < 0.6f) {
this->unk_196 = 0;
func_809BD4A4(this);
}
this->unk_195 = false;
}
}
}
void func_809BDF34(EnBigokuta* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
if (this->unk_196 != 0) {
this->unk_196--;
}
this->actor.world.pos.y = (sinf(this->unk_196 * (M_PI / 16)) * 100.0f) + this->actor.home.pos.y;
if (this->unk_196 == 0) {
func_809BD1C8(this, globalCtx);
func_809BD3F8(this);
}
}
void func_809BDFC8(EnBigokuta* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
if (this->unk_196 != 0) {
this->unk_196--;
}
if (this->unk_196 == 20) {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_VOICE);
}
if ((this->unk_196 == 0) && Math_ScaledStepToS(&this->actor.shape.rot.y, this->actor.world.rot.x, 0x800)) {
this->unk_194 = -this->unk_194;
func_809BD3F8(this);
}
}
void func_809BE058(EnBigokuta* this, GlobalContext* globalCtx) {
Player* player = GET_PLAYER(globalCtx);
f32 speedXZ;
if (this->unk_196 != 0) {
this->unk_196--;
}
SkelAnime_Update(&this->skelAnime);
if ((this->collider.base.ocFlags1 & OC1_HIT) || (this->cylinder[0].base.ocFlags1 & OC1_HIT) ||
(this->cylinder[1].base.ocFlags1 & OC1_HIT)) {
speedXZ = CLAMP_MIN(player->actor.speedXZ, 1.0f);
if (!(this->collider.base.ocFlags1 & OC1_HIT)) {
this->cylinder[0].base.ocFlags1 &= ~OC1_HIT;
this->cylinder[1].base.ocFlags1 &= ~OC1_HIT;
speedXZ *= -1.0f;
}
player->actor.world.pos.x -= speedXZ * Math_SinS(this->actor.shape.rot.y);
player->actor.world.pos.z -= speedXZ * Math_CosS(this->actor.shape.rot.y);
}
if (this->unk_196 == 0) {
func_809BD6B8(this);
}
}
void func_809BE180(EnBigokuta* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
if (this->unk_196 != 0) {
this->unk_196--;
}
if (this->unk_196 == 0) {
if (this->actor.colChkInfo.health != 0) {
func_809BD4A4(this);
} else {
func_809BD658(this);
}
} else if (this->unk_196 >= 8) {
this->actor.shape.rot.y += this->unk_194 * 0x200;
this->actor.world.pos.y = sinf((this->unk_196 - 8) * (M_PI / 16)) * 100.0f + this->actor.home.pos.y;
func_809BCE3C(this);
if (this->unk_196 == 8) {
func_809BD1C8(this, globalCtx);
}
}
}
void func_809BE26C(EnBigokuta* this, GlobalContext* globalCtx) {
Vec3f effectPos;
if (this->unk_196 != 0) {
if (this->unk_196 != 0) {
this->unk_196--;
}
if (this->unk_196 >= 10) {
this->actor.shape.rot.y += 0x2000;
}
} else if (SkelAnime_Update(&this->skelAnime)) {
if (this->unk_198 != 0) {
this->unk_198--;
}
if (this->unk_198 == 6) {
effectPos.x = this->actor.world.pos.x;
effectPos.y = this->actor.world.pos.y + 150.0f;
effectPos.z = this->actor.world.pos.z;
func_8002829C(globalCtx, &effectPos, &sEffectPosAccel, &sEffectPosAccel, &sEffectPrimColor,
&sEffectEnvColor, 1200, 20);
Audio_PlayActorSound2(&this->actor, NA_SE_EN_OCTAROCK_DEAD2);
}
if (this->unk_198 == 0 && Math_StepToF(&this->actor.scale.y, 0.0f, 0.001f)) {
Flags_SetClear(globalCtx, this->actor.room);
Camera_ChangeSetting(globalCtx->cameraPtrs[MAIN_CAM], CAM_SET_DUNGEON0);
func_8005ACFC(globalCtx->cameraPtrs[MAIN_CAM], 4);
SoundSource_PlaySfxAtFixedWorldPos(globalCtx, &this->actor.world.pos, 50, NA_SE_EN_OCTAROCK_BUBLE);
Item_DropCollectibleRandom(globalCtx, &this->actor, &this->actor.world.pos, 0xB0);
Actor_Kill(&this->actor);
}
}
}
void func_809BE3E4(EnBigokuta* this, GlobalContext* globalCtx) {
SkelAnime_Update(&this->skelAnime);
if (this->unk_196 != 0) {
if (this->unk_196 != 0) {
this->unk_196--;
}
this->actor.shape.rot.y += 0x2000;
}
if (this->unk_196 == 0) {
if ((s16)(this->actor.shape.rot.y - this->actor.world.rot.y) > 0) {
this->unk_194 = 1;
} else {
this->unk_194 = -1;
}
func_809BD3F8(this);
if (!this->unk_195) {
this->unk_196 = -40;
}
}
func_809BCF68(this, globalCtx);
}
void func_809BE4A4(EnBigokuta* this, GlobalContext* globalCtx) {
this->actor.world.pos.y -= 10.0f;
this->actor.shape.rot.y += 0x2000;
if (this->actor.world.pos.y < (this->actor.home.pos.y + -200.0f)) {
func_809BD7F0(this, globalCtx);
}
func_809BCF68(this, globalCtx);
}
void func_809BE518(EnBigokuta* this, GlobalContext* globalCtx) {
if (Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, 10.0f)) {
this->actor.flags |= ACTOR_FLAG_0;
func_809BD3F8(this);
}
}
void func_809BE568(EnBigokuta* this) {
s32 i;
f32 sin = Math_SinS(this->actor.shape.rot.y);
f32 cos = Math_CosS(this->actor.shape.rot.y);
this->collider.elements->dim.worldSphere.center.x =
(this->collider.elements->dim.modelSphere.center.z * sin) +
(this->actor.world.pos.x + (this->collider.elements->dim.modelSphere.center.x * cos));
this->collider.elements->dim.worldSphere.center.z =
(this->actor.world.pos.z + (this->collider.elements->dim.modelSphere.center.z * cos)) -
(this->collider.elements->dim.modelSphere.center.x * sin);
this->collider.elements->dim.worldSphere.center.y =
this->collider.elements->dim.modelSphere.center.y + this->actor.world.pos.y;
for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) {
this->cylinder[i].dim.pos.x =
this->actor.world.pos.x + sCylinderInit[i].dim.pos.z * sin + sCylinderInit[i].dim.pos.x * cos;
this->cylinder[i].dim.pos.z =
this->actor.world.pos.z + sCylinderInit[i].dim.pos.z * cos - sCylinderInit[i].dim.pos.x * sin;
this->cylinder[i].dim.pos.y = this->actor.world.pos.y;
}
}
void func_809BE798(EnBigokuta* this, GlobalContext* globalCtx) {
s16 effectRot;
s16 yawDiff;
if ((this->cylinder[0].base.atFlags & AT_HIT) || (this->cylinder[1].base.atFlags & AT_HIT) ||
(this->collider.base.atFlags & AT_HIT)) {
this->cylinder[0].base.atFlags &= ~AT_HIT;
this->cylinder[1].base.atFlags &= ~AT_HIT;
this->collider.base.atFlags &= ~AT_HIT;
yawDiff = this->actor.yawTowardsPlayer - this->actor.world.rot.y;
if (yawDiff > 0x4000) {
effectRot = 0x4000;
} else if (yawDiff > 0) {
effectRot = 0x6000;
} else if (yawDiff < -0x4000) {
effectRot = -0x4000;
} else {
effectRot = -0x6000;
}
func_8002F71C(globalCtx, &this->actor, 10.0f, this->actor.world.rot.y + effectRot, 5.0f);
if (this->actionFunc == func_809BDC08) {
func_809BD4A4(this);
this->unk_196 = 40;
} else if (this->actionFunc == func_809BE3E4) {
if ((effectRot * this->unk_194) > 0) {
this->unk_194 = 0 - this->unk_194;
this->unk_196 += 4;
}
}
}
}
void EnBigokuta_UpdateDamage(EnBigokuta* this, GlobalContext* globalCtx) {
if (this->collider.base.acFlags & AC_HIT) {
this->collider.base.acFlags &= ~AC_HIT;
if (this->actor.colChkInfo.damageEffect != 0 || this->actor.colChkInfo.damage != 0) {
if (this->actor.colChkInfo.damageEffect == 1) {
if (this->actionFunc != func_809BE058) {
func_809BD524(this);
}
} else if (this->actor.colChkInfo.damageEffect == 0xF) {
func_809BD47C(this);
} else if (!Actor_IsFacingPlayer(&this->actor, 0x4000)) {
if (Actor_ApplyDamage(&this->actor) == 0) { // Dead
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_DEAD);
Enemy_StartFinishingBlow(globalCtx, &this->actor);
} else {
Audio_PlayActorSound2(&this->actor, NA_SE_EN_DAIOCTA_DAMAGE);
}
func_809BD5E0(this);
}
}
}
}
void EnBigokuta_Update(Actor* thisx, GlobalContext* globalCtx2) {
EnBigokuta* this = (EnBigokuta*)thisx;
s32 i;
GlobalContext* globalCtx = globalCtx2;
func_809BE798(this, globalCtx);
EnBigokuta_UpdateDamage(this, globalCtx);
this->actionFunc(this, globalCtx);
func_809BD2E4(this);
func_809BE568(this);
Camera_ChangeSetting(globalCtx->cameraPtrs[MAIN_CAM], CAM_SET_BIG_OCTO);
func_8005AD1C(globalCtx->cameraPtrs[MAIN_CAM], 4);
if (this->cylinder[0].base.atFlags & AT_ON) {
if (this->actionFunc != func_809BE058) {
for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) {
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->cylinder[i].base);
}
this->actor.flags |= ACTOR_FLAG_24;
} else {
for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) {
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->cylinder[i].base);
}
}
for (i = 0; i < ARRAY_COUNT(this->cylinder); i++) {
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->cylinder[i].base);
}
if (this->collider.base.acFlags & AC_ON) {
CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
}
if (this->collider.base.acFlags & AC_ON) {
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
} else {
CollisionCheck_SetAT(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
Actor_SetFocus(&this->actor, this->actor.scale.y * 25.0f * 100.0f);
func_809BCEBC(this, globalCtx);
}
s32 EnBigokuta_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot,
void* thisx) {
EnBigokuta* this = (EnBigokuta*)thisx;
u8 intensity;
f32 temp_f0;
s32 temp_hi;
if (limbIndex == 15) {
if (this->actionFunc == func_809BE058 || this->actionFunc == func_809BE180) {
OPEN_DISPS(globalCtx->state.gfxCtx);
if (this->actionFunc == func_809BE058) {
temp_hi = this->unk_196 % 12;
if (temp_hi >= 8) {
temp_f0 = (12 - temp_hi) * (M_PI / 8);
} else {
temp_f0 = temp_hi * (M_PI / 16);
}
} else {
temp_hi = this->unk_196 % 6;
if (temp_hi >= 4) {
temp_f0 = (6 - temp_hi) * (M_PI / 4);
} else {
temp_f0 = temp_hi * (M_PI / 8);
}
}
temp_f0 = sinf(temp_f0) * 125.0f + 130.0f;
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, temp_f0, temp_f0, temp_f0, 255);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}
} else if (limbIndex == 10) {
OPEN_DISPS(globalCtx->state.gfxCtx);
if (this->actionFunc == func_809BE26C) {
intensity = this->unk_196 * (255.0f / 38);
} else {
intensity = 255;
}
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, intensity, intensity, intensity, intensity);
CLOSE_DISPS(globalCtx->state.gfxCtx);
} else if (limbIndex == 17 && this->actionFunc == func_809BE26C) {
if (this->unk_198 < 5) {
Matrix_Scale((this->unk_198 * 0.2f * 0.25f) + 1.0f, 1.0f, 1.0f, MTXMODE_APPLY);
} else if (this->unk_198 < 8) {
temp_f0 = (this->unk_198 - 5) * (1.0f / 12);
Matrix_Scale(1.25f - temp_f0, 1.0f + temp_f0, 1.0f + temp_f0, MTXMODE_APPLY);
} else {
temp_f0 = ((this->unk_198 - 8) * 0.125f);
Matrix_Scale(1.0f, 1.25f - temp_f0, 1.25f - temp_f0, MTXMODE_APPLY);
}
}
return false;
}
void EnBigokuta_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnBigokuta* this = (EnBigokuta*)thisx;
OPEN_DISPS(globalCtx->state.gfxCtx);
if ((this->actionFunc != func_809BE26C) || (this->unk_196 != 0) || (this->unk_198 != 0)) {
func_80093D18(globalCtx->state.gfxCtx);
gSPSegment(POLY_OPA_DISP++, 0x0C, &D_80116280[2]);
gDPSetEnvColor(POLY_OPA_DISP++, 255, 255, 255, 255);
if (this->unk_196 & 1) {
if ((this->actionFunc == func_809BE180 && this->unk_196 >= 8) ||
(this->actionFunc == func_809BE26C && this->unk_196 >= 10)) {
f32 rotX = Rand_ZeroOne() * (M_PI * 2.0f);
f32 rotY = Rand_ZeroOne() * (M_PI * 2.0f);
Matrix_RotateY(rotY, MTXMODE_APPLY);
Matrix_RotateX(rotX, MTXMODE_APPLY);
Matrix_Scale(0.78999996f, 1.3f, 0.78999996f, MTXMODE_APPLY);
Matrix_RotateX(-rotX, MTXMODE_APPLY);
Matrix_RotateY(-rotY, MTXMODE_APPLY);
}
}
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, EnBigokuta_OverrideLimbDraw, NULL, this);
} else {
func_80093D84(globalCtx->state.gfxCtx);
gSPSegment(POLY_XLU_DISP++, 0x0C, D_80116280);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (this->actor.scale.y * (255 / 0.033f)));
POLY_XLU_DISP = SkelAnime_DrawFlex(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable,
this->skelAnime.dListCount, NULL, NULL, NULL, POLY_XLU_DISP);
}
CLOSE_DISPS(globalCtx->state.gfxCtx);
}