mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-08-13 17:03:47 -04:00
39cc86c260
subrepo: subdir: "soh" merged: "ba904bbd0" upstream: origin: "https://github.com/HarbourMasters/soh.git" branch: "master" commit: "ba904bbd0" git-subrepo: version: "0.4.1" origin: "???" commit: "???"
902 lines
32 KiB
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, "../z_en_bigokuta.c", 1914);
|
|
|
|
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, "../z_en_bigokuta.c", 1945);
|
|
}
|
|
} else if (limbIndex == 10) {
|
|
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_en_bigokuta.c", 1950);
|
|
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, "../z_en_bigokuta.c", 1972);
|
|
} 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, "../z_en_bigokuta.c", 2017);
|
|
|
|
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, "../z_en_bigokuta.c", 2076);
|
|
}
|