* En_Fish

* R

* PR

* PR

* Update src/overlays/actors/ovl_En_Fish/z_en_fish.c

Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>

Co-authored-by: Kenix3 <kenixwhisperwind@gmail.com>
Co-authored-by: Derek Hensley <hensley.derek58@gmail.com>
This commit is contained in:
Maide 2022-01-04 04:29:49 +00:00 committed by GitHub
parent f66a9f8d0e
commit fc37051216
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 917 additions and 57 deletions

View File

@ -3912,8 +3912,8 @@ extern AnimatedMaterial D_0402C980;
extern AnimatedMaterial D_0402C9F8;
extern FlexSkeletonHeader D_0402CA98;
extern Gfx D_0402E510[];
extern UNK_TYPE D_0402E65C;
extern UNK_TYPE D_0402F0EC;
extern AnimationHeader D_0402E65C;
extern AnimationHeader D_0402F0EC;
extern Gfx D_04030100[]; // Floor shockwave ring
extern Gfx D_040301B0[];
extern UNK_TYPE D_04032270;

3
spec
View File

@ -1376,8 +1376,7 @@ beginseg
name "ovl_En_Fish"
compress
include "build/src/overlays/actors/ovl_En_Fish/z_en_fish.o"
include "build/data/ovl_En_Fish/ovl_En_Fish.data.o"
include "build/data/ovl_En_Fish/ovl_En_Fish.reloc.o"
include "build/src/overlays/actors/ovl_En_Fish/ovl_En_Fish_reloc.o"
endseg
beginseg

View File

@ -5,6 +5,7 @@
*/
#include "z_en_fish.h"
#include "objects/gameplay_keep/gameplay_keep.h"
#define FLAGS 0x00000000
@ -15,19 +16,56 @@ void EnFish_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnFish_Update(Actor* thisx, GlobalContext* globalCtx);
void EnFish_Draw(Actor* thisx, GlobalContext* globalCtx);
#if 0
// static ColliderJntSphElementInit sJntSphElementsInit[1] = {
static ColliderJntSphElementInit D_8091FA60[1] = {
void func_8091DF68(Actor* thisx, GlobalContext* globalCtx);
void func_8091E070(EnFish* this);
void func_8091E128(Actor* thisx, GlobalContext* globalCtx);
void func_8091E2E0(EnFish* this);
void func_8091E34C(Actor* thisx, GlobalContext* globalCtx2);
void func_8091E5EC(EnFish* this);
void func_8091E658(Actor* thisx, GlobalContext* globalCtx);
void func_8091E810(EnFish* this);
void func_8091E880(Actor* thisx, GlobalContext* globalCtx);
void func_8091E9A4(EnFish* this);
void func_8091EAF0(Actor* thisx, GlobalContext* globalCtx);
void func_8091ECF4(EnFish* this);
void func_8091ED70(Actor* thisx, GlobalContext* globalCtx);
void func_8091EF30(EnFish* this);
void func_8091EFE8(Actor* thisx, GlobalContext* globalCtx);
void func_8091F344(EnFish* this);
void func_8091F3BC(Actor* thisx, GlobalContext* globalCtx);
void func_8091F994(Actor* thisx, GlobalContext* globalCtx);
static ColliderJntSphElementInit sJntSphElementsInit[1] = {
{
{ ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
{
ELEMTYPE_UNK0,
{ 0x00000000, 0x00, 0x00 },
{ 0xF7CFFFFF, 0x00, 0x00 },
TOUCH_NONE | TOUCH_SFX_NORMAL,
BUMP_NONE,
OCELEM_ON,
},
{ 0, { { 0, 0, 0 }, 5 }, 100 },
},
};
// static ColliderJntSphInit sJntSphInit = {
static ColliderJntSphInit D_8091FA84 = {
{ COLTYPE_NONE, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_JNTSPH, },
1, D_8091FA60, // sJntSphElementsInit,
static ColliderJntSphInit sJntSphInit = {
{
COLTYPE_NONE,
AT_NONE,
AC_NONE,
OC1_ON | OC1_TYPE_ALL,
OC2_TYPE_1,
COLSHAPE_JNTSPH,
},
1,
sJntSphElementsInit,
};
static Color_RGB8 D_8091FA94[] = {
{ 255, 155, 55 },
{ 255, 47, 157 },
{ 215, 97, 7 },
};
const ActorInit En_Fish_InitVars = {
@ -42,87 +80,874 @@ const ActorInit En_Fish_InitVars = {
(ActorFunc)EnFish_Draw,
};
// static InitChainEntry sInitChain[] = {
static InitChainEntry D_8091FAC0[] = {
static InitChainEntry sInitChain[] = {
ICHAIN_F32(uncullZoneForward, 720, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneScale, 40, ICHAIN_CONTINUE),
ICHAIN_F32(uncullZoneDownward, 40, ICHAIN_STOP),
};
#endif
f32 func_8091D630(Vec3f* arg0, Vec3f* arg1) {
return SQ(arg0->x - arg1->x) + SQ(arg0->z - arg1->z);
}
extern ColliderJntSphElementInit D_8091FA60[1];
extern ColliderJntSphInit D_8091FA84;
extern InitChainEntry D_8091FAC0[];
void func_8091D660(EnFish* this) {
Animation_Change(&this->skelAnime, &gameplay_keep_Anim_02F0EC, 1.0f, 0.0f,
Animation_GetLastFrame(&gameplay_keep_Anim_02F0EC), 1, 2.0f);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D630.s")
void func_8091D6C4(EnFish* this) {
Animation_Change(&this->skelAnime, &gameplay_keep_Anim_02E65C, 1.0f, 0.0f,
Animation_GetLastFrame(&gameplay_keep_Anim_02E65C), 1, 2.0f);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D660.s")
void func_8091D728(EnFish* this) {
f32 phi_f0;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D6C4.s")
this->actor.scale.x = this->unk_250 * this->unk_25C;
this->actor.scale.y = this->unk_254 * this->unk_25C;
this->actor.scale.z = this->unk_258 * this->unk_25C;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D728.s")
if (this->actor.scale.z > 0.00001f) {
phi_f0 = 1.0f / this->actor.scale.z;
} else {
phi_f0 = 0.0f;
}
this->unk_264 = 16.0f * phi_f0;
this->unk_266 = 12.0f * phi_f0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D7C4.s")
void func_8091D7C4(EnFish* this) {
s32 pad;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D840.s")
Math_ScaledStepToS(&this->actor.world.rot.x, this->unk_268, this->unk_26E);
Math_ScaledStepToS(&this->actor.world.rot.y, this->unk_26A, this->unk_270);
if (this->actor.world.rot.z != this->unk_26C) {
Math_ScaledStepToS(&this->actor.world.rot.z, this->unk_26C, this->unk_272);
}
this->actor.shape.rot = this->actor.world.rot;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D904.s")
void func_8091D840(Actor* thisx, GlobalContext* globalCtx, s32 arg2, f32 arg3) {
EnFish* this = THIS;
s32 i;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091D944.s")
for (i = 0; i < arg2; i++) {
EffectSsBubble_Spawn(globalCtx, &this->actor.world.pos, 0.0f, arg3, arg3, (Rand_ZeroOne() * 0.09f) + 0.06f);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091DA14.s")
void func_8091D904(EnFish* this) {
this->unk_242 = 400;
this->unk_25C = this->unk_260 * 0.1f;
func_8091D728(this);
this->actor.draw = NULL;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/EnFish_Init.s")
Actor* func_8091D944(EnFish* this, GlobalContext* globalCtx) {
f32 distSq;
Actor* retActor = NULL;
f32 minDistSq = FLT_MAX;
Actor* foundActor = globalCtx->actorCtx.actorList[ACTORCAT_ITEMACTION].first;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/EnFish_Destroy.s")
while (foundActor != NULL) {
if ((foundActor->id == ACTOR_EN_FISH) && (foundActor->params == ENFISH_2) &&
(foundActor->room == this->actor.room)) {
distSq = Math3D_Vec3fDistSq(&foundActor->world.pos, &this->actor.world.pos);
if (retActor == NULL) {
retActor = foundActor;
minDistSq = distSq;
} else if (distSq < minDistSq) {
minDistSq = distSq;
}
}
foundActor = foundActor->next;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091DD48.s")
return retActor;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091DDF4.s")
s32 func_8091DA14(EnFish* this, GlobalContext* globalCtx) {
return globalCtx->sceneNum == SCENE_LABO && func_8091D944(this, globalCtx);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091DEE4.s")
void EnFish_Init(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnFish* this = THIS;
s16 sp36 = this->actor.params;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091DF68.s")
Collider_InitJntSph(globalCtx, &this->collider);
if (sp36 == ENFISH_2) {
this->actor.draw = NULL;
this->actor.update = func_8091F994;
return;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E070.s")
Actor_ProcessInitChain(&this->actor, sInitChain);
this->unk_250 = 1.0f;
this->unk_254 = 1.0f;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E128.s")
if (sp36 == ENFISH_MINUS1) {
this->unk_258 = (Rand_ZeroOne() * 0.9f) + 0.6f;
this->unk_25C = ((Rand_ZeroOne() * 1.2f) + 0.6f) * 0.01f;
} else {
this->unk_258 = 1.0f;
this->unk_25C = 0.01f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E2E0.s")
this->unk_260 = this->unk_25C;
func_8091D728(this);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E34C.s")
if ((this->unk_258 * this->unk_25C * 100.0f) < 1.02f) {
this->unk_278 = 2;
} else if ((this->unk_258 * this->unk_25C * 100.0f) < 2.0f) {
this->unk_278 = 1;
} else {
this->unk_278 = 0;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E5EC.s")
SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gameplay_keep_Skel_02F028, &gameplay_keep_Anim_02F0EC,
this->jointTable, this->morphTable, 7);
Collider_SetJntSph(globalCtx, &this->collider, &this->actor, &sJntSphInit, this->colliderElements);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E658.s")
this->actor.colChkInfo.mass = this->unk_25C * 30.0f;
this->unk_244 = (u32)Rand_Next() >> 0x10;
this->unk_246 = (u32)Rand_Next() >> 0x10;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E810.s")
if (sp36 == ENFISH_0) {
this->actor.flags |= 0x10;
ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 8.0f);
func_8091E810(this);
} else if (sp36 == ENFISH_1) {
func_8091F344(this);
} else {
func_8091E070(this);
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E880.s")
void EnFish_Destroy(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnFish* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091E9A4.s")
Collider_DestroyJntSph(globalCtx, &this->collider);
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091EAF0.s")
void func_8091DD48(EnFish* this) {
this->actor.shape.yOffset += (Math_SinS(this->unk_246) * 5.0f) + (Math_SinS(this->unk_244) * 10.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091ECF4.s")
if (this->actor.shape.yOffset < -200.0f) {
this->actor.shape.yOffset = -200.0f;
} else if (this->actor.shape.yOffset > 200.0f) {
this->actor.shape.yOffset = 200.0f;
}
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091ED70.s")
s32 func_8091DDF4(EnFish* this, GlobalContext* globalCtx) {
s32 pad;
Player* player = GET_PLAYER(globalCtx);
Vec3f sp1C;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091EF30.s")
if (this->actor.xzDistToPlayer < 50.0f) {
sp1C.x = (Math_SinS(BINANG_ROT180(this->actor.yawTowardsPlayer)) * 30.0f) + player->actor.world.pos.x;
sp1C.y = player->actor.world.pos.y;
sp1C.z = (Math_CosS(BINANG_ROT180(this->actor.yawTowardsPlayer)) * 30.0f) + player->actor.world.pos.z;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091EFE8.s")
if (func_8091D630(&sp1C, &this->actor.world.pos) <= SQ(30.0f)) {
return true;
}
}
return false;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091F344.s")
void func_8091DEE4(EnFish* this) {
static s16 D_8091FACC[] = { 85, 60, 45 };
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091F3BC.s")
this->actor.gravity = 0.0f;
this->actor.minVelocityY = 0.0f;
this->unk_240 = Rand_S16Offset(5, D_8091FACC[this->unk_278]);
this->unk_248 = 0;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_268 = 0;
this->unk_26C = 0;
func_8091D660(this);
this->unk_24C = 0.0f;
this->unkFunc = func_8091DF68;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091F5A4.s")
void func_8091DF68(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091F830.s")
func_8091DD48(this);
Math_SmoothStepToF(&thisx->speedXZ, 0.0f, 0.05f, 0.3f, 0.0f);
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/EnFish_Update.s")
if ((thisx->speedXZ * 1.4f) + 0.8f > 2.0f) {
this->skelAnime.playSpeed = 2.0f;
} else {
this->skelAnime.playSpeed = (thisx->speedXZ * 1.4f) + 0.8f;
}
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/func_8091F994.s")
this->unk_270 >>= 1;
#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Fish/EnFish_Draw.s")
if (this->unk_240 <= 0) {
func_8091E070(this);
} else if (thisx == thisx->child) {
func_8091E5EC(this);
} else if ((thisx->xzDistToPlayer < 60.0f) || (this->unk_276 > 0)) {
func_8091E2E0(this);
}
}
void func_8091E070(EnFish* this) {
static s16 D_8091FAD4[] = { 20, 30, 40 };
s16 phi_a1;
this->actor.gravity = 0.0f;
this->actor.minVelocityY = 0.0f;
if ((Rand_Next() & 3) == 0) {
if (((Rand_Next() & 7) == 0) && (this->unk_278 != 0)) {
phi_a1 = 80;
} else {
phi_a1 = 45;
}
} else {
phi_a1 = D_8091FAD4[this->unk_278];
}
this->unk_240 = Rand_S16Offset(15, phi_a1);
this->unk_248 = 0;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_26C = 0;
func_8091D660(this);
this->unkFunc = func_8091E128;
}
void func_8091E128(Actor* thisx, GlobalContext* globalCtx) {
s32 pad;
EnFish* this = THIS;
func_8091DD48(this);
Math_SmoothStepToF(&thisx->speedXZ, 1.8f, 0.08f, 0.4f, 0.0f);
if ((func_8091D630(&thisx->world.pos, &thisx->home.pos) > SQ(80.0f)) || (this->unk_240 < 4)) {
this->unk_270 = this->unk_264;
this->unk_26A = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->home.pos);
this->unk_24C = 1.0f;
} else if ((thisx->child != NULL) && (thisx != thisx->child)) {
this->unk_270 = this->unk_264;
this->unk_26A = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->child->world.pos);
this->unk_24C = 1.2f;
} else {
this->unk_270 >>= 2;
this->unk_24C = 0.0f;
}
if ((thisx->speedXZ * 1.5f) + 0.8f > 4.0f) {
this->skelAnime.playSpeed = 4.0f;
} else {
this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 0.8f;
}
if (this->unk_240 <= 0) {
func_8091DEE4(this);
} else if (thisx == thisx->child) {
func_8091E5EC(this);
} else if ((thisx->xzDistToPlayer < 60.0f) || (this->unk_276 > 0)) {
func_8091E2E0(this);
}
}
void func_8091E2E0(EnFish* this) {
this->actor.gravity = 0.0f;
this->actor.minVelocityY = 0.0f;
this->unk_240 = Rand_S16Offset(10, 40);
this->unk_248 = 0;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_268 = 0;
this->unk_26C = 0;
func_8091D660(this);
this->unkFunc = func_8091E34C;
}
void func_8091E34C(Actor* thisx, GlobalContext* globalCtx2) {
GlobalContext* globalCtx = globalCtx2;
EnFish* this = THIS;
s32 sp3C = thisx->xzDistToPlayer < 60.0f;
s32 sp38 = this->unk_276 > 0;
s32 pad;
func_8091DD48(this);
Math_SmoothStepToF(&thisx->speedXZ, 4.2f, 0.08f, 1.4f, 0.0f);
if (func_8091D630(&thisx->world.pos, &thisx->home.pos) > SQ(160.0f)) {
this->unk_270 = this->unk_264;
this->unk_26A = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->home.pos);
this->unk_24C = 0.8f;
} else if ((thisx->child != NULL) && (thisx != thisx->child)) {
this->unk_270 = this->unk_266;
this->unk_26A = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->child->world.pos);
this->unk_24C = 1.0f;
} else if (sp3C) {
this->unk_26A = BINANG_ROT180(thisx->yawTowardsPlayer);
if ((globalCtx->state.frames & 0x10) == 0) {
if ((globalCtx->state.frames & 0x20) == 0) {
this->unk_26A += 0x2000;
}
} else if ((globalCtx->state.frames & 0x20) == 0) {
this->unk_26A -= 0x2000;
}
this->unk_270 = this->unk_266;
this->unk_24C = 1.2f;
} else if (sp38 != 0) {
if ((globalCtx->state.frames & 0x10) == 0) {
s16 temp = BINANG_SUB(thisx->shape.rot.y, this->unk_274);
if (temp < 0) {
this->unk_26A = BINANG_SUB(this->unk_274, 0x4000);
} else {
this->unk_26A = BINANG_ADD(this->unk_274, 0x4000);
}
} else {
this->unk_26A = BINANG_ROT180(this->unk_274);
}
this->unk_24C = 1.2f;
this->unk_270 = this->unk_266;
} else {
this->unk_270 >>= 2;
this->unk_24C = 0.0f;
}
if ((thisx->speedXZ * 1.5f) + 0.8f > 4.0f) {
this->skelAnime.playSpeed = 4.0f;
} else {
this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 0.8f;
}
if ((this->unk_240 <= 0) || (!sp3C && (sp38 == 0))) {
func_8091DEE4(this);
} else if (thisx == thisx->child) {
func_8091E5EC(this);
}
}
void func_8091E5EC(EnFish* this) {
this->actor.gravity = 0.0f;
this->actor.minVelocityY = 0.0f;
this->unk_26E = 400;
this->unk_272 = 400;
this->unk_268 = 0;
this->unk_26C = 0;
func_8091D660(this);
this->unk_240 = Rand_S16Offset(10, 30);
this->unk_248 = 0;
this->unkFunc = func_8091E658;
}
void func_8091E658(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
Player* player = GET_PLAYER(globalCtx);
s32 pad;
Vec3f sp38;
s32 pad2;
s16 sp32;
func_8091DD48(this);
Math_SmoothStepToF(&thisx->speedXZ, 1.8f, 0.1f, 0.5f, 0.0f);
if (func_8091D630(&thisx->world.pos, &thisx->home.pos) > SQ(80.0f)) {
this->unk_270 = this->unk_264;
this->unk_26A = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->home.pos);
this->unk_24C = 1.0f;
} else {
if ((globalCtx->state.frames & 0x40) == 0) {
sp32 = BINANG_ADD(thisx->yawTowardsPlayer, 0x9000);
} else {
sp32 = BINANG_ADD(thisx->yawTowardsPlayer, 0x7000);
}
sp38.x = (Math_SinS(sp32) * 20.0f) + player->actor.world.pos.x;
sp38.y = player->actor.world.pos.y;
sp38.z = (Math_CosS(sp32) * 20.0f) + player->actor.world.pos.z;
this->unk_270 = this->unk_264;
this->unk_26A = Math_Vec3f_Yaw(&thisx->world.pos, &sp38);
this->unk_24C = 1.2f;
}
if ((thisx->speedXZ * 1.5f) + 0.8f > 4.0f) {
this->skelAnime.playSpeed = 4.0f;
} else {
this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 0.8f;
}
if (this->unk_240 <= 0) {
func_8091DEE4(this);
}
}
void func_8091E810(EnFish* this) {
this->unk_270 = 0;
this->unk_26A = 0;
this->actor.gravity = -1.0f;
this->actor.minVelocityY = -10.0f;
this->actor.shape.yOffset = 0.0f;
func_8091D6C4(this);
this->unk_248 = 5;
this->unkFunc = func_8091E880;
this->unk_24C = 0.0f;
this->unk_240 = 300;
}
void func_8091E880(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
Math_SmoothStepToF(&this->actor.speedXZ, 0.0f, 0.1f, 0.1f, 0.0f);
this->unk_26E = 0x43;
this->unk_272 = 0x43;
this->unk_268 = 0x4000;
this->unk_26C = -0x4000;
if (this->actor.bgCheckFlags & 1) {
this->unk_240 = 400;
func_8091E9A4(this);
} else if (this->actor.bgCheckFlags & 0x20) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_DIVE_INTO_WATER_L);
func_8091D840(thisx, globalCtx, 10, 15.0f);
if (func_8091DA14(this, globalCtx)) {
func_8091EF30(this);
} else {
func_8091ECF4(this);
}
} else if ((this->unk_240 <= 0) && (this->actor.params == ENFISH_0) &&
(this->actor.floorHeight < BGCHECK_Y_MIN + 10)) {
Actor_MarkForDeath(&this->actor);
}
}
void func_8091E9A4(EnFish* this) {
s32 pad[2];
s32 sp24;
f32 temp_f0;
this->actor.gravity = -1.0f;
this->actor.minVelocityY = -10.0f;
temp_f0 = Rand_ZeroOne();
if (temp_f0 < 0.1f) {
this->actor.velocity.y = (Rand_ZeroOne() * 3.0f) + 2.5f;
sp24 = true;
} else if (temp_f0 < 0.2f) {
this->actor.velocity.y = (Rand_ZeroOne() * 1.2f) + 0.2f;
sp24 = true;
} else {
this->actor.velocity.y = 0.0f;
if (Rand_ZeroOne() < 0.2f) {
sp24 = true;
} else {
sp24 = false;
}
}
this->actor.shape.yOffset = 300.0f;
func_8091D6C4(this);
this->unkFunc = func_8091EAF0;
this->unk_248 = 5;
this->unk_24C = 0.0f;
if (sp24 && (this->actor.draw != NULL)) {
Audio_PlayActorSound2(&this->actor, NA_SE_EV_FISH_LEAP);
}
}
void func_8091EAF0(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
s32 sp40 = globalCtx->state.frames;
s16 phi_v1;
Math_SmoothStepToF(&this->actor.speedXZ, Rand_ZeroOne() * 0.2f, 0.1f, 0.1f, 0.0f);
phi_v1 = (s16)((((sp40 >> 5) & 2) | ((sp40 >> 2) & 1)) << 0xB) * 0.3f;
if (sp40 & 4) {
phi_v1 *= -1;
}
this->unk_268 = phi_v1;
this->unk_26E = 0xA6B;
this->unk_26C = 0x4000;
this->unk_272 = 0x29B;
this->unk_270 = ((Math_SinS(this->unk_244) * 1333.0f) + (Math_SinS(this->unk_246) * 667.0f)) * Rand_ZeroOne();
if (this->unk_270 >= 0) {
this->unk_26A = BINANG_ADD(this->actor.world.rot.y, 0x4000);
} else {
this->unk_26A = BINANG_SUB(this->actor.world.rot.y, 0x4000);
this->unk_270 = -this->unk_270;
}
if (this->unk_240 <= 0) {
Actor_MarkForDeath(&this->actor);
} else if (this->unk_240 <= 60) {
if (sp40 & 4) {
this->actor.draw = EnFish_Draw;
} else {
this->actor.draw = NULL;
}
} else if (this->actor.bgCheckFlags & 0x20) {
if (func_8091DA14(this, globalCtx)) {
func_8091EF30(this);
} else {
func_8091ECF4(this);
}
} else if (this->actor.bgCheckFlags & 1) {
func_8091E9A4(this);
}
}
void func_8091ECF4(EnFish* this) {
this->actor.home.pos = this->actor.world.pos;
this->actor.gravity = 0.0f;
this->actor.minVelocityY = 0.0f;
this->actor.shape.yOffset = 0.0f;
this->actor.flags |= 0x10;
this->unk_240 = 200;
func_8091D660(this);
this->unkFunc = func_8091ED70;
this->unk_248 = 5;
this->unk_24C = 0.0f;
}
void func_8091ED70(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
s32 pad;
s16 sp2E;
if (this->unk_240 >= 0xBF) {
func_8091D840(thisx, globalCtx, 2, 25.0f);
}
Math_SmoothStepToF(&thisx->speedXZ, 2.8f, 0.1f, 0.4f, 0.0f);
if ((thisx->bgCheckFlags & 8) || !(thisx->bgCheckFlags & 0x20)) {
sp2E = Math_Vec3f_Yaw(&thisx->world.pos, &thisx->home.pos);
thisx->home.rot.y = Rand_S16Offset(-100, 100) + sp2E;
thisx->speedXZ *= 0.5f;
}
this->unk_268 = 0;
this->unk_26A = thisx->home.rot.y;
this->unk_26C = 0;
this->unk_26E = 1000;
this->unk_270 = 2000;
this->unk_272 = 0x29B;
if (thisx->bgCheckFlags & 1) {
Math_StepToF(&thisx->world.pos.y, thisx->home.pos.y - 4.0f, 2.0f);
} else {
Math_StepToF(&thisx->world.pos.y, thisx->home.pos.y - 10.0f, 2.0f);
}
if (this->unk_240 < 100) {
this->unk_25C *= 0.982f;
func_8091D728(this);
}
if ((thisx->speedXZ * 1.5f) + 1.0f > 4.8f) {
this->skelAnime.playSpeed = 4.8f;
} else {
this->skelAnime.playSpeed = (thisx->speedXZ * 1.5f) + 1.0f;
}
if (this->unk_240 <= 0) {
Actor_MarkForDeath(thisx);
}
}
void func_8091EF30(EnFish* this) {
this->actor.gravity = -2.0f;
this->actor.minVelocityY = -10.0f;
this->actor.shape.yOffset = 0.0f;
if (this->actor.velocity.y < -1.0f) {
this->actor.velocity.y = -1.0f;
}
this->actor.flags |= 0x10;
this->actor.home.pos.x = this->actor.world.pos.x;
this->actor.home.pos.y = this->actor.world.pos.y - 20.0f;
this->actor.home.pos.z = this->actor.world.pos.z;
func_8091D660(this);
this->unk_240 = 15;
this->unk_279 = 10;
this->unkFunc = func_8091EFE8;
this->unk_248 = 5;
this->unk_24C = 0.0f;
}
void func_8091EFE8(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
s32 temp_v0_2;
Actor* sp3C = func_8091D944(this, globalCtx);
f32 temp_f0;
f32 sp34;
f32 sp30;
s16 sp2E;
if (sp3C == 0) {
Actor_MarkForDeath(&this->actor);
return;
}
if (this->unk_240 <= 0) {
this->unk_240 = Rand_S16Offset(5, 35);
}
if (this->unk_277 == 0) {
Math_SmoothStepToF(&this->actor.speedXZ, 2.8f, 0.1f, 0.4f, 0.0f);
if (this->unk_240 < 6) {
this->actor.speedXZ *= 0.75f;
}
}
if ((this->actor.bgCheckFlags & 8) && !(this->actor.bgCheckFlags & 0x20)) {
this->actor.speedXZ *= 0.5f;
}
if (!((u32)Rand_Next() >> 0x1B) || ((this->actor.bgCheckFlags & 8) && !((u32)Rand_Next() >> 0x1E)) ||
!(this->actor.bgCheckFlags & 0x20)) {
temp_f0 = Rand_ZeroOne();
sp34 = (1.0f - SQ(temp_f0)) * sp3C->home.rot.x;
sp30 = Rand_ZeroOne() * sp3C->home.rot.z;
sp2E = (u32)Rand_Next() >> 0x10;
this->actor.home.pos.x = (Math_SinS(sp2E) * sp34) + sp3C->world.pos.x;
this->actor.home.pos.y = sp3C->world.pos.y + sp30;
this->actor.home.pos.z = (Math_CosS(sp2E) * sp34) + sp3C->world.pos.z;
this->actor.home.rot.y =
Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos) + Rand_S16Offset(-100, 100);
}
this->unk_268 = Math_Vec3f_Pitch(&this->actor.world.pos, &this->actor.home.pos);
this->unk_26C = 0;
this->unk_26A = this->actor.home.rot.y;
temp_v0_2 = BINANG_SUB(this->unk_268, this->actor.shape.rot.x);
temp_v0_2 = ABS_ALT(temp_v0_2);
temp_v0_2 = temp_v0_2 / 11;
if (temp_v0_2 > 800) {
temp_v0_2 = 800;
} else if (temp_v0_2 < 100) {
temp_v0_2 = 100;
}
if (this->unk_279 > 0) {
this->unk_279--;
this->unk_26E = 1000;
} else {
this->unk_26E = temp_v0_2;
}
if (this->unk_240 < 10) {
this->unk_270 = 400;
} else {
this->unk_270 = 2000;
}
this->unk_272 = 0x29B;
if (fabsf(this->actor.world.pos.y - this->actor.home.pos.y) < 2.0f) {
this->actor.gravity = 0.0f;
} else if (this->actor.home.pos.y < this->actor.world.pos.y) {
this->actor.gravity = -0.15f;
} else {
this->actor.gravity = 0.15f;
}
this->actor.velocity.y *= 0.8f;
if ((this->actor.speedXZ * 1.5f) + 1.0f > 4.8f) {
this->skelAnime.playSpeed = 4.8f;
} else {
this->skelAnime.playSpeed = (this->actor.speedXZ * 1.5f) + 1.0f;
}
}
void func_8091F344(EnFish* this) {
this->actor.gravity = 0.0f;
this->actor.minVelocityY = 0.0f;
this->unk_240 = Rand_S16Offset(5, 35);
this->unk_248 = 1;
this->unk_268 = 0;
this->unk_26C = 0;
this->unk_26E = 1500;
this->unk_272 = 0;
func_8091D660(this);
this->unkFunc = func_8091F3BC;
this->unk_24C = 0.0f;
}
void func_8091F3BC(Actor* thisx, GlobalContext* globalCtx) {
static Vec3f D_8091FADC = { 0.0f, 0.04f, 0.09f };
static Vec3f D_8091FAE8 = { 0.5f, 0.1f, 0.15f };
EnFish* this = THIS;
s32 sp40 = globalCtx->gameplayFrames;
Vec3f* sp3C;
f32 phi_f0;
f32 temp_f2;
if ((this->actor.xzDistToPlayer < 60.0f) || ((sp40 & 0x1FF) < 20)) {
if (this->unk_240 < 12) {
sp3C = &D_8091FAE8;
} else {
sp3C = &D_8091FADC;
}
} else if (this->unk_240 < 4) {
sp3C = &D_8091FAE8;
} else {
sp3C = &D_8091FADC;
}
func_8091DD48(this);
Math_StepToF(&this->actor.world.pos.y, this->actor.home.pos.y, 2.0f);
Math_SmoothStepToF(&this->actor.speedXZ, sp3C->x, sp3C->y, sp3C->z, 0.0f);
this->unk_24C = 0.0f;
if (func_8091D630(&this->actor.world.pos, &this->actor.home.pos) > SQ(15.0f)) {
this->unk_26A = Math_Vec3f_Yaw(&this->actor.world.pos, &this->actor.home.pos);
this->unk_270 = 0x85;
phi_f0 = 0.4f;
} else if (this->unk_240 < 4) {
this->unk_26A = sp40 << 7;
this->unk_270 = 0x43;
phi_f0 = 0.4f;
} else {
this->unk_270 = 0;
phi_f0 = 0.0f;
}
temp_f2 = this->actor.speedXZ + 0.4f + phi_f0;
this->skelAnime.playSpeed = CLAMP(temp_f2, 0.5f, 1.6f);
if (this->unk_240 <= 0) {
this->unk_240 = Rand_S16Offset(5, 80);
}
}
void func_8091F5A4(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
Actor* temp_v0_2;
s16 temp_v0;
s16 temp_v0_4;
s32 temp_v1;
s32 phi_v1;
f32 phi_f0;
if (this->unk_240 > 0) {
this->unk_240--;
}
this->unk_244 += 0x111;
this->unk_246 += 0x500;
if ((this->actor.child != NULL) && (this->actor.child->update == NULL) && (thisx != this->actor.child)) {
this->actor.child = NULL;
}
if ((this->unkFunc == NULL) || (this->unkFunc(&this->actor, globalCtx), (this->actor.update != NULL))) {
if ((ABS_ALT(BINANG_SUB(this->unk_26A, this->actor.shape.rot.y)) > 0x3000) && (this->unk_270 > 1000)) {
this->skelAnime.playSpeed += this->unk_24C;
}
SkelAnime_Update(&this->skelAnime);
func_8091D7C4(this);
Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
if (this->unk_248 != 0) {
u32 temp = (globalCtx->sceneNum ^ SCENE_LABO) != 0;
phi_f0 = BREG(1) + 10.0f;
if (temp) {
phi_f0 = 6.0f;
}
Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 17.5f, phi_f0, 0.0f, this->unk_248);
}
if ((this->actor.xzDistToPlayer < 70.0f) && (this->unkFunc != func_8091EFE8)) {
ColliderJntSphElement* element = &this->collider.elements[0];
element->dim.worldSphere.center.x = this->actor.world.pos.x;
element->dim.worldSphere.center.y = this->actor.world.pos.y;
element->dim.worldSphere.center.z = this->actor.world.pos.z;
element->dim.worldSphere.radius = this->unk_25C * 500.0f;
CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
}
Actor_SetHeight(&this->actor, this->actor.shape.yOffset * 0.01f);
if (Actor_HasParent(&this->actor, globalCtx)) {
this->actor.parent = NULL;
if (this->actor.params == ENFISH_0) {
Actor_MarkForDeath(&this->actor);
} else {
func_8091D904(this);
}
} else if (func_8091DDF4(this, globalCtx)) {
func_800B8A1C(&this->actor, globalCtx, 0xBA, 80.0f, 25.0f);
}
}
}
void func_8091F830(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
if (this->actor.params == ENFISH_1) {
Actor_MarkForDeath(&this->actor);
return;
}
if ((this->actor.child != NULL) && (this->actor.child->update == NULL) && (thisx != this->actor.child)) {
this->actor.child = NULL;
}
if ((this->unkFunc == NULL) || (this->unkFunc(&this->actor, globalCtx), (this->actor.update != NULL))) {
func_8091D7C4(this);
Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor);
if (this->unk_242 == 20) {
this->actor.draw = EnFish_Draw;
} else if (this->unk_242 == 0) {
this->unk_25C = this->unk_260;
func_8091D728(this);
} else if (this->unk_242 < 20) {
this->unk_25C += 0.1f * this->unk_260;
if (this->unk_260 < this->unk_25C) {
this->unk_25C = this->unk_260;
}
func_8091D728(this);
}
}
}
void EnFish_Update(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
if (this->unk_242 > 0) {
this->unk_242--;
func_8091F830(thisx, globalCtx);
} else {
func_8091F5A4(thisx, globalCtx);
}
if (this->unk_276 > 0) {
this->unk_276--;
}
}
void func_8091F994(Actor* thisx, GlobalContext* globalCtx) {
}
void EnFish_Draw(Actor* thisx, GlobalContext* globalCtx) {
EnFish* this = THIS;
Color_RGB8* colour = &D_8091FA94[this->unk_278];
OPEN_DISPS(globalCtx->state.gfxCtx);
func_8012C28C(globalCtx->state.gfxCtx);
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, colour->r, colour->g, colour->b, 255);
SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
NULL, NULL, NULL);
CLOSE_DISPS(globalCtx->state.gfxCtx);
}

View File

@ -5,11 +5,47 @@
struct EnFish;
typedef void (*EnFishUnkFunc)(Actor*, GlobalContext*);
enum {
/* -1 */ ENFISH_MINUS1 = -1,
/* 0 */ ENFISH_0,
/* 1 */ ENFISH_1,
/* 2 */ ENFISH_2,
};
typedef struct EnFish {
/* 0x000 */ Actor actor;
/* 0x144 */ char unk144[0x133];
/* 0x277 */ s8 unk_277;
/* 0x278 */ char unk278[0x4];
/* 0x144 */ ColliderJntSph collider;
/* 0x164 */ ColliderJntSphElement colliderElements[1];
/* 0x1A4 */ SkelAnime skelAnime;
/* 0x1E8 */ Vec3s jointTable[7];
/* 0x212 */ Vec3s morphTable[7];
/* 0x23C */ EnFishUnkFunc unkFunc;
/* 0x240 */ s16 unk_240;
/* 0x242 */ s16 unk_242;
/* 0x244 */ s16 unk_244;
/* 0x246 */ s16 unk_246;
/* 0x248 */ s32 unk_248;
/* 0x24C */ f32 unk_24C;
/* 0x250 */ f32 unk_250;
/* 0x254 */ f32 unk_254;
/* 0x258 */ f32 unk_258;
/* 0x25C */ f32 unk_25C;
/* 0x260 */ f32 unk_260;
/* 0x264 */ s16 unk_264;
/* 0x266 */ s16 unk_266;
/* 0x268 */ s16 unk_268;
/* 0x26A */ s16 unk_26A;
/* 0x26C */ s16 unk_26C;
/* 0x26E */ s16 unk_26E;
/* 0x270 */ s16 unk_270;
/* 0x272 */ s16 unk_272;
/* 0x274 */ s16 unk_274;
/* 0x276 */ s8 unk_276;
/* 0x277 */ u8 unk_277;
/* 0x278 */ s8 unk_278;
/* 0x279 */ s8 unk_279;
} EnFish; // size = 0x27C
extern const ActorInit En_Fish_InitVars;