diff --git a/spec b/spec index 0909055e85..d9b75d9f99 100644 --- a/spec +++ b/spec @@ -4436,9 +4436,7 @@ beginseg name "ovl_Obj_Hunsui" compress include "build/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.o" - include "build/data/ovl_Obj_Hunsui/ovl_Obj_Hunsui.data.o" - include "build/data/ovl_Obj_Hunsui/ovl_Obj_Hunsui.bss.o" - include "build/data/ovl_Obj_Hunsui/ovl_Obj_Hunsui.reloc.o" + include "build/src/overlays/actors/ovl_Obj_Hunsui/ovl_Obj_Hunsui_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h index 01d11886ae..b487762387 100644 --- a/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h +++ b/src/overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h @@ -11,6 +11,8 @@ typedef void (*BgDblueMovebgActionFunc)(struct BgDblueMovebg*, GlobalContext*); #define BGDBLUEMOVEBG_GET_FF0(thisx) (((thisx)->params >> 4) & 0xFF) #define BGDBLUEMOVEBG_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF) +#define BGDBLUEMOVEBG_F_8 8 + typedef struct BgDblueMovebg { /* 0x000 */ DynaPolyActor dyna; /* 0x15C */ BgDblueMovebgActionFunc actionFunc; diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c index 869acdb434..05f6b212da 100644 --- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c +++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.c @@ -5,6 +5,7 @@ */ #include "z_obj_hunsui.h" +#include "objects/object_hunsui/object_hunsui.h" #define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20) @@ -15,7 +16,36 @@ void ObjHunsui_Destroy(Actor* thisx, GlobalContext* globalCtx); void ObjHunsui_Update(Actor* thisx, GlobalContext* globalCtx); void ObjHunsui_Draw(Actor* thisx, GlobalContext* globalCtx); -#if 0 +void func_80B9CE64(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9D0FC(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9D120(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9D2BC(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9D4D0(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9D508(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9D714(ObjHunsui* this, GlobalContext* globalCtx); +void func_80B9DA60(Actor* thisx, GlobalContext* globalCtx); + +AnimatedMaterial* D_80B9DED0; +AnimatedMaterial* D_80B9DED4; + +typedef struct { + /* 0x00 */ u8 unk_00; + /* 0x01 */ u8 unk_01; + /* 0x02 */ u8 unk_02; +} ObjHansuiBssStruct; // size = 0x3 + +ObjHansuiBssStruct D_80B9DED8; + +typedef struct { + /* 0x00 */ u8 unk_00; + /* 0x01 */ u8 unk_01; +} ObjHansuiStruct; // size = 0x2 + +ObjHansuiStruct D_80B9DC70[] = { + { 1, 1 }, { 1, 0 }, { 2, 3 }, { 2, 1 }, { 2, 2 }, { 2, 0 }, { 3, 7 }, + { 3, 3 }, { 3, 5 }, { 3, 1 }, { 3, 6 }, { 3, 2 }, { 3, 4 }, { 3, 0 }, +}; + const ActorInit Obj_Hunsui_InitVars = { ACTOR_OBJ_HUNSUI, ACTORCAT_BG, @@ -28,42 +58,622 @@ const ActorInit Obj_Hunsui_InitVars = { (ActorFunc)ObjHunsui_Draw, }; -#endif +static InitChainEntry sInitChain[] = { + ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 400, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneDownward, 400, ICHAIN_STOP), +}; -extern UNK_TYPE D_06000220; -extern UNK_TYPE D_06000C74; -extern UNK_TYPE D_06000EC0; +s32 func_80B9C450(GlobalContext* globalCtx, s32 arg1, s32 arg2) { + s32 sp2C = 1; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9C450.s") + if (arg2 < ARRAY_COUNT(D_80B9DC70)) { + s32 val = D_80B9DC70[arg2].unk_00; + s32 val3 = D_80B9DC70[arg2].unk_01; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9C5E8.s") + while (val--) { + if ((1 << val) & val3) { + if (!Flags_GetSwitch(globalCtx, arg1 + val)) { + sp2C = 0; + break; + } + } else if (Flags_GetSwitch(globalCtx, arg1 + val)) { + sp2C = 0; + break; + } + } + } else { + sp2C = 0; + switch (arg2) { + case 14: + if (!Flags_GetSwitch(globalCtx, arg1)) { + sp2C = 1; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/ObjHunsui_Init.s") + if (Flags_GetSwitch(globalCtx, arg1 + 1) && Flags_GetSwitch(globalCtx, arg1 + 2) && + Flags_GetSwitch(globalCtx, arg1 + 3)) { + sp2C += 2; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/ObjHunsui_Destroy.s") + case 15: + if (!Flags_GetSwitch(globalCtx, arg1) || + (Flags_GetSwitch(globalCtx, arg1 + 1) && Flags_GetSwitch(globalCtx, arg1 + 2) && + Flags_GetSwitch(globalCtx, arg1 + 3))) { + sp2C = 1; + } + break; + } + } + return sp2C; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/ObjHunsui_Update.s") +void func_80B9C5E8(ObjHunsui* this, GlobalContext* globalCtx) { + Player* player = GET_PLAYER(globalCtx); + f32 temp_f10; + f32 temp_f16; + Vec3f sp40; + s16 sp3E; + f32 sp38; + f32 sp34; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9CE64.s") + if ((this->dyna.actor.xzDistToPlayer < (45.0f * this->dyna.actor.scale.x * 10.0f)) && + (this->dyna.actor.playerHeightRel < -21.0f)) { + if (DynaPolyActor_IsInRidingMovingState(&this->dyna)) { + this->unk_172 &= ~8; + this->unk_19C = 0.0f; + this->unk_1A0 = 0.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D094.s") + this->unk_18C++; + if (this->unk_18C >= 3) { + this->unk_18C = 0; + Math_Vec3f_Copy(&sp40, &player->actor.world.pos); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D0FC.s") + sp40.x += randPlusMinusPoint5Scaled(10.0f); + sp40.z += randPlusMinusPoint5Scaled(10.0f); + sp40.y += Rand_ZeroFloat(2.0f); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D120.s") + EffectSsGSplash_Spawn(globalCtx, &sp40, NULL, NULL, 2.0f * Rand_ZeroOne(), 1); + } + } else { + this->unk_172 |= 8; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D288.s") + this->unk_18C++; + if (this->unk_18C >= 3) { + Math_Vec3f_Copy(&sp40, &player->actor.world.pos); + this->unk_18C = 0; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D2BC.s") + sp40.x += randPlusMinusPoint5Scaled(10.0f); + sp40.z += randPlusMinusPoint5Scaled(10.0f); + sp40.y += Rand_ZeroFloat(45.0f); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D334.s") + EffectSsGSplash_Spawn(globalCtx, &sp40, NULL, NULL, 1, 1); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D4D0.s") + sp3E = BINANG_ROT180(player->actor.world.rot.y - this->dyna.actor.yawTowardsPlayer); + player->actor.gravity = 0.0f; + player->actor.velocity.y = 0.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D508.s") + if ((this->unk_160 != OBJHUNSUI_F000_5) && (this->unk_160 != OBJHUNSUI_F000_6)) { + Math_SmoothStepToF(&player->actor.world.pos.y, this->dyna.actor.world.pos.y, 0.5f, 4.0f, 1.0f); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9D714.s") + if ((sp3E < 0x4000) && (sp3E > -0x4000)) { + this->unk_1A4 = BINANG_ROT180(player->actor.world.rot.y); + sp34 = this->dyna.actor.xzDistToPlayer / (45.0f * this->dyna.actor.scale.x * 10.0f); + if (1) {} + sp38 = this->dyna.actor.xzDistToPlayer / (45.0f * this->dyna.actor.scale.x * 10.0f); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/ObjHunsui_Draw.s") + if (sp38 > 1.0f) { + sp38 = sp34; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Hunsui/func_80B9DA60.s") + player->linearVelocity *= sp38; + + if ((this->unk_160 == OBJHUNSUI_F000_5) || (this->unk_160 == OBJHUNSUI_F000_6)) { + Math_ApproachF(&this->unk_1A0, 4.5f, 2.0f, 1.0f); + Math_ApproachF(&this->unk_19C, this->unk_1A0, 2.0f, 0.3f * sp38); + } else { + Math_ApproachF(&this->unk_1A0, 3.0f, 1.0f, 1.0f); + Math_ApproachF(&this->unk_19C, this->unk_1A0, 1.0f, 0.3f * sp38); + } + } else { + this->unk_1A4 = player->actor.world.rot.y; + player->linearVelocity *= 0.5f; + Math_ApproachF(&this->unk_1A0, 3.0f, 1.0f, 1.0f); + Math_ApproachF(&this->unk_19C, this->unk_1A0, 1.0f, 0.1f); + } + player->unk_B84 = this->unk_1A4; + player->unk_B80 = this->unk_19C; + } + } else { + if (this->unk_172 & 8) { + player->linearVelocity = this->unk_19C + player->linearVelocity; + player->currentYaw = this->unk_1A4; + } + this->unk_1A0 = 0.0f; + this->unk_19C = 0.0f; + this->unk_172 &= ~8; + } +} + +void ObjHunsui_Init(Actor* thisx, GlobalContext* globalCtx) { + ObjHunsui* this = THIS; + + Actor_ProcessInitChain(&this->dyna.actor, sInitChain); + this->unk_160 = OBJHUNSUI_GET_F000(thisx); + this->unk_164 = OBJHUNSUI_GET_F80(thisx); + this->unk_168 = OBJHUNSUI_GET_7F(thisx); + DynaPolyActor_Init(&this->dyna, 1); + + if ((this->unk_160 != OBJHUNSUI_F000_5) && (this->unk_160 != OBJHUNSUI_F000_6)) { + DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &object_hunsui_Colheader_000C74); + } + + D_80B9DED0 = Lib_SegmentedToVirtual(object_hunsui_Matanimheader_000BF0); + D_80B9DED4 = Lib_SegmentedToVirtual(object_hunsui_Matanimheader_001888); + SubS_FillCutscenesList(&this->dyna.actor, &this->unk_170, 1); + this->unk_18C = 0; + + switch (this->unk_160) { + case OBJHUNSUI_F000_1: + case OBJHUNSUI_F000_2: + case OBJHUNSUI_F000_3: + case OBJHUNSUI_F000_4: + case OBJHUNSUI_F000_5: + case OBJHUNSUI_F000_6: + this->dyna.actor.uncullZoneScale = 900.0f; + this->dyna.actor.uncullZoneDownward = 90.0f; + this->dyna.actor.uncullZoneForward = 4000.0f; + break; + } + + switch (this->unk_160) { + case OBJHUNSUI_F000_5: + if (D_80B9DED8.unk_01 == 0) { + D_80B9DED8.unk_01 = 1; + this->unk_16C = this->dyna.actor.room; + this->unk_16D = this->dyna.actor.world.rot.z; + this->dyna.actor.world.rot.z = 0; + this->dyna.actor.shape.rot.z = 0; + this->dyna.actor.room = -1; + } else { + Actor_MarkForDeath(&this->dyna.actor); + return; + } + break; + + case OBJHUNSUI_F000_6: + if (D_80B9DED8.unk_02 == 0) { + D_80B9DED8.unk_02 = 1; + this->unk_16C = this->dyna.actor.room; + this->unk_16D = this->dyna.actor.world.rot.z; + this->dyna.actor.world.rot.z = 0; + this->dyna.actor.shape.rot.z = 0; + this->dyna.actor.room = -1; + } else { + Actor_MarkForDeath(&this->dyna.actor); + return; + } + break; + } + + switch (this->unk_160) { + case OBJHUNSUI_F000_0: + if (D_80B9DED8.unk_00 == 0) { + D_80B9DED8.unk_00 = 1; + this->unk_16C = this->dyna.actor.room; + this->unk_16D = this->unk_164; + // clang-format off + this->dyna.actor.room = -1; this->actionFunc = func_80B9D714; + // clang-format on + } else { + Actor_MarkForDeath(&this->dyna.actor); + return; + } + break; + + case OBJHUNSUI_F000_2: + this->unk_172 |= 1; + + case OBJHUNSUI_F000_1: + this->dyna.actor.draw = func_80B9DA60; + if ((this->unk_172 & 1) && func_80B9C450(globalCtx, this->unk_168, this->unk_164)) { + this->unk_174 = 240.0f; + this->unk_172 |= 4; + this->unk_184 = 0xFF0; + } else { + this->unk_174 = -30.0f; + this->unk_172 |= 2; + this->unk_184 = 0; + } + this->unk_178 = this->unk_174; + this->unk_180 = func_80B9C450(globalCtx, this->unk_168, this->unk_164); + this->actionFunc = func_80B9CE64; + break; + + case OBJHUNSUI_F000_4: + this->unk_172 |= 1; + + case OBJHUNSUI_F000_3: + case OBJHUNSUI_F000_5: + case OBJHUNSUI_F000_6: + this->dyna.actor.draw = func_80B9DA60; + if ((this->unk_160 == OBJHUNSUI_F000_5) || (this->unk_160 == OBJHUNSUI_F000_6)) { + func_80B9D2BC(this, globalCtx); + this->unk_178 = this->unk_174; + } else { + if ((this->unk_172 & 1) || func_80B9C450(globalCtx, this->unk_168, this->unk_164)) { + func_80B9D4D0(this, globalCtx); + } else { + func_80B9D0FC(this, globalCtx); + } + this->unk_178 = this->unk_174; + } + break; + } +} + +void ObjHunsui_Destroy(Actor* thisx, GlobalContext* globalCtx) { + ObjHunsui* this = THIS; + + DynaPoly_DeleteBgActor(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); +} + +void ObjHunsui_Update(Actor* thisx, GlobalContext* globalCtx) { + ObjHunsui* this = THIS; + + this->actionFunc(this, globalCtx); + + if ((this->unk_172 & 0x40) && SubS_StartActorCutscene(&this->dyna.actor, this->unk_17C, -1, 0)) { + this->unk_172 &= ~0x40; + } + + if (this->unk_1AC > 1024.0f) { + this->unk_1AC -= 1024.0f; + } + + if (this->unk_1AC <= 0.0f) { + this->unk_1AC += 1024.0f; + } +} + +void func_80B9CE64(ObjHunsui* this, GlobalContext* globalCtx) { + s32 sp2C; + f32 sins; + + if (!(this->unk_172 & 2)) { + func_80B9C5E8(this, globalCtx); + } + + this->unk_18A += 0x71C; + Math_SmoothStepToF(&this->unk_190, this->unk_194, 1.0f, 0.2f, 0.01f); + + sp2C = func_80B9C450(globalCtx, this->unk_168, this->unk_164); + + if (!(this->unk_172 & 1)) { + if (sp2C != this->unk_180) { + this->unk_17C = this->unk_170; + this->unk_172 |= 0x40; + } + } + + if ((this->unk_172 & 1) || (sp2C != 0)) { + this->unk_172 &= ~2; + if (this->unk_186 == 0) { + this->unk_172 |= 0x10; + this->unk_174 = 240.0f; + if (this->unk_178 == 240.0f) { + if (this->unk_188++ > 40) { + this->unk_188 = 0; + this->unk_186 = 1; + this->unk_194 = 0.0f; + } else { + this->unk_194 = 8.0f; + } + } + } else { + this->unk_174 = 30.0f; + if (this->unk_178 == 30.0f) { + if (this->unk_188++ > 40) { + this->unk_188 = 0; + this->unk_186 = 0; + this->unk_194 = 0.0f; + } else { + this->unk_194 = 8.0f; + } + } + } + } else { + this->unk_174 = -30.0f; + if (this->unk_178 == -30.0f) { + this->unk_172 &= ~0x10; + this->unk_172 |= 2; + } + } + + sins = Math_SinS(this->unk_18A); + this->unk_198 = sins * this->unk_190; + if (!(this->unk_172 & 0x40)) { + Math_SmoothStepToF(&this->unk_178, this->unk_174, 0.6f, 10.5f, 0.05f); + } + + this->dyna.actor.world.pos.y = this->unk_198 + (this->dyna.actor.home.pos.y + this->unk_178); + this->unk_180 = sp2C; +} + +void func_80B9D094(ObjHunsui* this, GlobalContext* globalCtx) { + f32 sins; + + this->unk_18A += 0x71C; + Math_SmoothStepToF(&this->unk_190, this->unk_194, 1.0f, 0.2f, 0.01f); + sins = Math_SinS(this->unk_18A); + this->unk_198 = sins * this->unk_190; +} + +void func_80B9D0FC(ObjHunsui* this, GlobalContext* globalCtx) { + this->unk_174 = -30.0f; + this->actionFunc = func_80B9D120; +} + +void func_80B9D120(ObjHunsui* this, GlobalContext* globalCtx) { + if (((this->unk_160 == OBJHUNSUI_F000_5) || (this->unk_160 == OBJHUNSUI_F000_6)) && + (this->unk_16C != globalCtx->roomCtx.currRoom.num) && (this->unk_16C != globalCtx->roomCtx.prevRoom.num) && + ((this->unk_16D != globalCtx->roomCtx.currRoom.num) && (this->unk_16D != globalCtx->roomCtx.prevRoom.num))) { + switch (this->unk_160) { + case OBJHUNSUI_F000_5: + D_80B9DED8.unk_01 = 0; + break; + + case OBJHUNSUI_F000_6: + D_80B9DED8.unk_02 = 0; + break; + } + Actor_MarkForDeath(&this->dyna.actor); + return; + } + + func_80B9D094(this, globalCtx); + if (!(this->unk_172 & 0x40)) { + Math_SmoothStepToF(&this->unk_178, this->unk_174, 0.6f, 10.5f, 0.05f); + } + + this->dyna.actor.world.pos.y = this->unk_198 + (this->dyna.actor.home.pos.y + this->unk_178); + if (this->unk_178 == this->unk_174) { + this->unk_172 &= ~0x10; + this->unk_172 |= 2; + } + + if (func_80B9C450(globalCtx, this->unk_168, this->unk_164)) { + this->unk_17C = this->unk_170; + this->unk_172 |= 0x40; + func_80B9D4D0(this, globalCtx); + } +} + +s32 func_80B9D288(GlobalContext* globalCtx, Actor* thisx, Actor* iter, void* verifyData) { + s32 ret = false; + + if (BGDBLUEMOVEBG_GET_F(iter) == BGDBLUEMOVEBG_F_8) { + ret = true; + } + return ret; +} + +void func_80B9D2BC(ObjHunsui* this, GlobalContext* globalCtx) { + if ((this->unk_172 & 1) || func_80B9C450(globalCtx, this->unk_168, this->unk_164)) { + func_80B9D4D0(this, globalCtx); + } else { + this->unk_172 |= 2; + func_80B9D0FC(this, globalCtx); + } +} + +void func_80B9D334(ObjHunsui* this, GlobalContext* globalCtx) { + Vec3f sp74; + s32 i; + s32 phi_s2 = 0; + s32 phi_s3; + + switch (this->unk_160) { + case OBJHUNSUI_F000_5: + phi_s2 = 1; + break; + + case OBJHUNSUI_F000_6: + break; + } + + if (this->unk_1B4 != NULL) { + phi_s3 = false; + for (i = 0; i < 8; i++) { + if (this->unk_1B4->unk_300[phi_s2][i] == (phi_s2 + 1)) { + phi_s3 = true; + Math_Vec3f_Copy(&sp74, &this->unk_1B4->unk_238[phi_s2][i]); + this->unk_174 = sp74.y - this->dyna.actor.home.pos.y; + if (this->unk_174 > 240.0f) { + this->unk_174 = 240.0f; + } + this->unk_190 = 0.0f; + this->unk_198 = 0.0f; + this->unk_18A = 0; + } + } + + if (!phi_s3) { + this->unk_174 = 240; + } + } else { + Actor* dblueMovebg = SubS_FindActorCustom(globalCtx, &this->dyna.actor, NULL, ACTORCAT_BG, + ACTOR_BG_DBLUE_MOVEBG, NULL, func_80B9D288); + + if (dblueMovebg != NULL) { + this->unk_1B4 = (BgDblueMovebg*)dblueMovebg; + func_80B9D2BC(this, globalCtx); + } + } +} + +void func_80B9D4D0(ObjHunsui* this, GlobalContext* globalCtx) { + this->unk_172 &= ~2; + this->unk_172 |= 0x10; + this->unk_174 = 240.0f; + this->actionFunc = func_80B9D508; +} + +void func_80B9D508(ObjHunsui* this, GlobalContext* globalCtx) { + if (((this->unk_160 == OBJHUNSUI_F000_5) || (this->unk_160 == OBJHUNSUI_F000_6)) && + (this->unk_16C != globalCtx->roomCtx.currRoom.num) && (this->unk_16C != globalCtx->roomCtx.prevRoom.num) && + (this->unk_16D != globalCtx->roomCtx.currRoom.num) && (this->unk_16D != globalCtx->roomCtx.prevRoom.num)) { + switch (this->unk_160) { + case OBJHUNSUI_F000_5: + D_80B9DED8.unk_01 = 0; + break; + + case OBJHUNSUI_F000_6: + D_80B9DED8.unk_02 = 0; + break; + } + Actor_MarkForDeath(&this->dyna.actor); + return; + } + + func_80B9C5E8(this, globalCtx); + func_80B9D094(this, globalCtx); + + if (((this->unk_160 == OBJHUNSUI_F000_5) || (this->unk_160 == OBJHUNSUI_F000_6)) && + (globalCtx->roomCtx.currRoom.num == 8)) { + func_80B9D334(this, globalCtx); + } + + if (!(this->unk_172 & 0x40)) { + Math_SmoothStepToF(&this->unk_178, this->unk_174, 0.6f, 10.5f, 0.05f); + } + + this->dyna.actor.world.pos.y = this->unk_198 + (this->dyna.actor.home.pos.y + this->unk_178); + + if ((this->unk_160 == OBJHUNSUI_F000_6) || (this->unk_160 == OBJHUNSUI_F000_5)) { + this->unk_1AC += -10.0f + (1.8f * (this->dyna.actor.world.pos.y - this->dyna.actor.prevPos.y)); + this->unk_1B0 += -8.0f + (0.9f * (this->dyna.actor.world.pos.y - this->dyna.actor.prevPos.y)); + } + + if (!(this->unk_172 & 1) && !func_80B9C450(globalCtx, this->unk_168, this->unk_164)) { + this->unk_17C = this->unk_170; + this->unk_172 |= 0x40; + func_80B9D0FC(this, globalCtx); + } +} + +void func_80B9D714(ObjHunsui* this, GlobalContext* globalCtx) { + s32 pad; + Player* player = GET_PLAYER(globalCtx); + s16 cs; + f32 sp28; + + if ((this->unk_16C != globalCtx->roomCtx.currRoom.num) && (this->unk_16C != globalCtx->roomCtx.prevRoom.num) && + (this->unk_16D != globalCtx->roomCtx.currRoom.num) && (this->unk_16D != globalCtx->roomCtx.prevRoom.num)) { + Actor_MarkForDeath(&this->dyna.actor); + } else { + if (Flags_GetSwitch(globalCtx, this->unk_168)) { + this->unk_172 &= ~2; + this->unk_172 |= 0x10; + cs = this->dyna.actor.cutscene; + + if (this->unk_16E == 0) { + if ((cs >= 0) && !ActorCutscene_GetCanPlayNext(cs)) { + ActorCutscene_SetIntentToPlay(cs); + } else if (cs >= 0) { + ActorCutscene_StartAndSetUnkLinkFields(cs, &this->dyna.actor); + this->unk_16E = -1; + } else { + this->unk_16E = 40; + } + } else if (this->unk_16E < 0) { + if (func_800F22C4(cs, &this->dyna.actor)) { + this->unk_16E = 40; + } + } else { + s32 pad; + + if (Math_SmoothStepToF(&this->dyna.actor.world.pos.y, this->dyna.actor.home.pos.y + 800.0f, 0.1f, 8.0f, + 1.0f) < 0.5f) { + if (DECR(this->unk_16E) == 0) { + Flags_UnsetSwitch(globalCtx, this->unk_168); + } + } + this->dyna.actor.velocity.y = this->dyna.actor.world.pos.y - this->dyna.actor.prevPos.y; + } + } else { + Math_StepToF(&this->dyna.actor.velocity.y, -10.0f, 4.0f); + this->dyna.actor.world.pos.y += this->dyna.actor.velocity.y; + if (this->dyna.actor.world.pos.y < this->dyna.actor.home.pos.y) { + this->dyna.actor.world.pos.y = this->dyna.actor.home.pos.y; + this->unk_172 &= ~0x10; + this->unk_172 |= 2; + } + } + } + + if (!DynaPolyActor_IsInRidingMovingState(&this->dyna)) { + if (this->dyna.actor.xzDistToPlayer < 45.0f) { + if ((this->dyna.actor.playerHeightRel < -this->dyna.actor.velocity.y) && + (this->dyna.actor.playerHeightRel >= -800.0f)) { + sp28 = (45.0f - this->dyna.actor.xzDistToPlayer) * 0.5f; + player->actor.world.pos.x += sp28 * Math_SinS(this->dyna.actor.yawTowardsPlayer); + player->actor.world.pos.z += sp28 * Math_CosS(this->dyna.actor.yawTowardsPlayer); + } + } + } +} + +void ObjHunsui_Draw(Actor* thisx, GlobalContext* globalCtx) { + ObjHunsui* this = THIS; + + if (this->unk_172 & 0x10) { + f32 temp_f8 = (this->dyna.actor.world.pos.y - this->dyna.actor.home.pos.y) / 800.0f; + + func_8019FAD8(&this->dyna.actor.projectedPos, NA_SE_EV_WATER_PILLAR - SFX_FLAG, 1.0f + temp_f8); + } + + if (!(this->unk_172 & 2)) { + AnimatedMat_Draw(globalCtx, D_80B9DED0); + Gfx_DrawDListXlu(globalCtx, object_hunsui_DL_000220); + } +} + +void func_80B9DA60(Actor* thisx, GlobalContext* globalCtx) { + s32 pad; + ObjHunsui* this = THIS; + f32 temp; + + if (this->unk_172 & 0x10) { + temp = 1.0f + ((this->unk_178 - 240.0f) / 270.0f); + func_8019FAD8(&this->dyna.actor.projectedPos, NA_SE_EV_WATER_PILLAR - SFX_FLAG, 1.0f + temp); + } + + if ((this->dyna.actor.flags & ACTOR_FLAG_40) && !(this->unk_172 & 2)) { + if ((this->unk_160 == OBJHUNSUI_F000_6) || (this->unk_160 == OBJHUNSUI_F000_5)) { + OPEN_DISPS(globalCtx->state.gfxCtx); + + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, (globalCtx->gameplayFrames % 128) * -9, 0x20, + 0x20, 1, 0, (globalCtx->gameplayFrames % 128) * -8, 0x20, 0x20)); + gSPSegment(POLY_XLU_DISP++, 0x09, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, (s32)this->unk_1AC, 0x20, 0x20, 1, 0, + (s32)this->unk_1B0, 0x20, 0x20)); + + CLOSE_DISPS(globalCtx->state.gfxCtx); + } else { + AnimatedMat_DrawXlu(globalCtx, D_80B9DED4); + } + + OPEN_DISPS(globalCtx->state.gfxCtx); + + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x7F, 255, 255, 255, 127); + + Gfx_DrawDListXlu(globalCtx, object_hunsui_DL_000EC0); + + CLOSE_DISPS(globalCtx->state.gfxCtx); + } +} diff --git a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h index c71a8a3d15..cbf1e4f133 100644 --- a/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h +++ b/src/overlays/actors/ovl_Obj_Hunsui/z_obj_hunsui.h @@ -2,18 +2,56 @@ #define Z_OBJ_HUNSUI_H #include "global.h" +#include "overlays/actors/ovl_Bg_Dblue_Movebg/z_bg_dblue_movebg.h" struct ObjHunsui; typedef void (*ObjHunsuiActionFunc)(struct ObjHunsui*, GlobalContext*); +#define OBJHUNSUI_GET_7F(thisx) ((thisx)->params & 0x7F) +#define OBJHUNSUI_GET_F80(thisx) (((thisx)->params >> 7) & 0x1F) #define OBJHUNSUI_GET_F000(thisx) (((thisx)->params >> 0xC) & 0xF) +enum { + /* 0 */ OBJHUNSUI_F000_0, + /* 1 */ OBJHUNSUI_F000_1, + /* 2 */ OBJHUNSUI_F000_2, + /* 3 */ OBJHUNSUI_F000_3, + /* 4 */ OBJHUNSUI_F000_4, + /* 5 */ OBJHUNSUI_F000_5, + /* 6 */ OBJHUNSUI_F000_6, +}; + typedef struct ObjHunsui { - /* 0x0000 */ Actor actor; - /* 0x0144 */ char unk_144[0x18]; + /* 0x0000 */ DynaPolyActor dyna; /* 0x015C */ ObjHunsuiActionFunc actionFunc; - /* 0x0160 */ char unk_160[0x58]; + /* 0x0160 */ s16 unk_160; + /* 0x0164 */ s32 unk_164; + /* 0x0168 */ s32 unk_168; + /* 0x016C */ s8 unk_16C; + /* 0x016D */ s8 unk_16D; + /* 0x016E */ s8 unk_16E; + /* 0x0170 */ s16 unk_170; + /* 0x0172 */ u16 unk_172; + /* 0x0174 */ f32 unk_174; + /* 0x0178 */ f32 unk_178; + /* 0x017C */ s16 unk_17C; + /* 0x0180 */ s32 unk_180; + /* 0x0184 */ s16 unk_184; + /* 0x0186 */ s16 unk_186; + /* 0x0188 */ s16 unk_188; + /* 0x018A */ s16 unk_18A; + /* 0x018C */ s16 unk_18C; + /* 0x0190 */ f32 unk_190; + /* 0x0194 */ f32 unk_194; + /* 0x0198 */ f32 unk_198; + /* 0x019C */ f32 unk_19C; + /* 0x01A0 */ f32 unk_1A0; + /* 0x01A4 */ s16 unk_1A4; + /* 0x0196 */ UNK_TYPE1 unk1A6[0x6]; + /* 0x01AC */ f32 unk_1AC; + /* 0x01B0 */ f32 unk_1B0; + /* 0x01B4 */ BgDblueMovebg* unk_1B4; } ObjHunsui; // size = 0x1B8 extern const ActorInit Obj_Hunsui_InitVars; diff --git a/undefined_syms.txt b/undefined_syms.txt index 90419cbcee..161c34f49f 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -2043,14 +2043,6 @@ D_06002FC4 = 0x06002FC4; D_06000080 = 0x06000080; D_06000110 = 0x06000110; -// ovl_Obj_Hunsui - -D_06000220 = 0x06000220; -D_06000BF0 = 0x06000BF0; -D_06000C74 = 0x06000C74; -D_06000EC0 = 0x06000EC0; -D_06001888 = 0x06001888; - // ovl_Obj_Jgame_Light D_060003A0 = 0x060003A0;