diff --git a/assets/xml/objects/object_iknv_obj.xml b/assets/xml/objects/object_iknv_obj.xml index 1e10d813c..58926c0e3 100644 --- a/assets/xml/objects/object_iknv_obj.xml +++ b/assets/xml/objects/object_iknv_obj.xml @@ -33,6 +33,7 @@ + @@ -58,7 +59,7 @@ - + diff --git a/spec b/spec index f2a7ad9cd..449dbefea 100644 --- a/spec +++ b/spec @@ -4603,8 +4603,7 @@ beginseg name "ovl_Bg_Iknv_Doukutu" compress include "build/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.o" - include "build/data/ovl_Bg_Iknv_Doukutu/ovl_Bg_Iknv_Doukutu.data.o" - include "build/data/ovl_Bg_Iknv_Doukutu/ovl_Bg_Iknv_Doukutu.reloc.o" + include "build/src/overlays/actors/ovl_Bg_Iknv_Doukutu/ovl_Bg_Iknv_Doukutu_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c index 20a753fe2..06091b12b 100644 --- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c +++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.c @@ -5,6 +5,7 @@ */ #include "z_bg_iknv_doukutu.h" +#include "objects/object_iknv_obj/object_iknv_obj.h" #define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_20) @@ -21,8 +22,11 @@ void func_80BD7250(BgIknvDoukutu* this, PlayState* play); void func_80BD72BC(BgIknvDoukutu* this, PlayState* play); void func_80BD7360(BgIknvDoukutu* this, PlayState* play); void func_80BD73D0(BgIknvDoukutu* this, PlayState* play); +void func_80BD7768(Actor* thisx, PlayState* play); +void func_80BD7820(Actor* thisx, PlayState* play); +void func_80BD78C4(Actor* thisx, PlayState* play); +void func_80BD7538(Actor* thisx, PlayState* play); -#if 0 const ActorInit Bg_Iknv_Doukutu_InitVars = { ACTOR_BG_IKNV_DOUKUTU, ACTORCAT_BG, @@ -35,38 +39,233 @@ const ActorInit Bg_Iknv_Doukutu_InitVars = { (ActorFunc)BgIknvDoukutu_Draw, }; -#endif +void BgIknvDoukutu_Init(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + CollisionHeader* colHeader = NULL; + s32 pad; -extern UNK_TYPE D_0600F1C0; -extern UNK_TYPE D_06010D98; -extern UNK_TYPE D_060117A0; -extern UNK_TYPE D_06012728; -extern UNK_TYPE D_06012788; + Actor_SetScale(&this->dyna.actor, 0.1f); + this->actionFunc = func_80BD73D0; + this->unk_15C = 0; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/BgIknvDoukutu_Init.s") + switch (BGIKNVDOUKUTU_GET_F(&this->dyna.actor)) { + case BGIKNVDOUKUTU_F_0: + this->actionFunc = func_80BD71BC; + this->csAction = 0x204; + this->unk_160 = 1.0f; + if ((gSaveContext.save.weekEventReg[14] & 4) || (gSaveContext.save.weekEventReg[52] & 0x20)) { + this->dyna.actor.draw = func_80BD7768; + this->actionFunc = func_80BD73D0; + play->envCtx.lightSettingOverride = 25; + } else { + play->envCtx.lightSettingOverride = 24; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/BgIknvDoukutu_Destroy.s") + case BGIKNVDOUKUTU_F_1: + Actor_SetScale(&this->dyna.actor, 1.0f); + this->dyna.actor.draw = func_80BD7820; + this->csAction = 0x204; + DynaPolyActor_Init(&this->dyna, 0); + CollisionHeader_GetVirtual(&object_iknv_obj_Colheader_012788, &colHeader); + this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader); + if (!(gSaveContext.save.weekEventReg[14] & 4)) { + Actor_MarkForDeath(&this->dyna.actor); + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD716C.s") + case BGIKNVDOUKUTU_F_2: + this->csAction = 0x204; + this->dyna.actor.draw = func_80BD78C4; + DynaPolyActor_Init(&this->dyna, 0); + CollisionHeader_GetVirtual(&object_iknv_obj_Colheader_0117C8, &colHeader); + this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader); + if (gSaveContext.save.weekEventReg[14] & 4) { + this->unk_160 = 1.0f; + this->dyna.actor.world.pos.y += 68.0f; + } else { + this->actionFunc = func_80BD7360; + this->unk_160 = 0.0f; + } + break; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD71BC.s") + default: + Actor_MarkForDeath(&this->dyna.actor); + break; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD7250.s") +void BgIknvDoukutu_Destroy(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD72BC.s") + if ((BGIKNVDOUKUTU_GET_F(&this->dyna.actor) == BGIKNVDOUKUTU_F_1) || + (BGIKNVDOUKUTU_GET_F(&this->dyna.actor) == BGIKNVDOUKUTU_F_2)) { + DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD7360.s") +void func_80BD716C(BgIknvDoukutu* this, PlayState* play) { + if (this->unk_160 >= 0.05f) { + this->unk_160 -= 0.05f; + } else { + this->actionFunc = func_80BD73D0; + this->dyna.actor.draw = func_80BD7768; + } + play->envCtx.lightSettingOverride = 25; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD73D0.s") +void func_80BD71BC(BgIknvDoukutu* this, PlayState* play) { + play->envCtx.lightSettingOverride = 24; + if (Cutscene_CheckActorAction(play, this->csAction) && + (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action == 2)) { + this->actionFunc = func_80BD716C; + this->dyna.actor.draw = func_80BD7538; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/BgIknvDoukutu_Update.s") +void func_80BD7250(BgIknvDoukutu* this, PlayState* play) { + f32 temp_fv0 = this->dyna.actor.home.pos.y + 68.0f; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/BgIknvDoukutu_Draw.s") + this->dyna.actor.world.pos.y += 1.7f; + if (temp_fv0 < this->dyna.actor.world.pos.y) { + this->dyna.actor.world.pos.y = temp_fv0; + this->actionFunc = func_80BD73D0; + } + func_8019F128(NA_SE_EV_WATER_LEVEL_DOWN - SFX_FLAG); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD7538.s") +void func_80BD72BC(BgIknvDoukutu* this, PlayState* play) { + if (Cutscene_CheckActorAction(play, this->csAction) && + (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action == 3)) { + this->actionFunc = func_80BD7250; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD7768.s") + if (this->unk_160 < 0.95f) { + this->unk_160 += 0.05f; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD7820.s") +void func_80BD7360(BgIknvDoukutu* this, PlayState* play) { + if (Cutscene_CheckActorAction(play, this->csAction) && + (play->csCtx.actorActions[Cutscene_GetActorActionIndex(play, this->csAction)]->action == 2)) { + this->actionFunc = func_80BD72BC; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Iknv_Doukutu/func_80BD78C4.s") +void func_80BD73D0(BgIknvDoukutu* this, PlayState* play) { +} + +void BgIknvDoukutu_Update(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + + this->actionFunc(this, play); +} + +void BgIknvDoukutu_Draw(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + + OPEN_DISPS(play->state.gfxCtx); + + AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_iknv_obj_Matanimheader_00F1C0)); + Scene_SetRenderModeXlu(play, 0, 1); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + func_8012C28C(play->state.gfxCtx); + func_8012C2DC(play->state.gfxCtx); + + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + gSPDisplayList(POLY_OPA_DISP++, object_iknv_obj_DL_00DDD8); + gDPSetEnvColor(POLY_XLU_DISP++, 215, 42, 55, 120); + gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_00DB60); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void func_80BD7538(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + GraphicsContext* gfxCtx; + f32 sp54; + + func_80BD7768(&this->dyna.actor, play); + + gfxCtx = play->state.gfxCtx; + OPEN_DISPS(gfxCtx); + Vec3f sp40; + s16 sp3E = Math_Vec3f_Yaw(&GET_ACTIVE_CAM(play)->eye, &GET_ACTIVE_CAM(play)->at); + s16 sp3C = -Math_Vec3f_Pitch(&GET_ACTIVE_CAM(play)->eye, &GET_ACTIVE_CAM(play)->at); + + sp40.x = -100.0f * Math_SinS(sp3E) * Math_CosS(sp3C); + sp40.y = Math_SinS(sp3C) * -100.0f; + sp40.z = -100.0f * Math_CosS(sp3E) * Math_CosS(sp3C); + Matrix_Translate(sp40.x, sp40.y, sp40.z, MTXMODE_APPLY); + sp54 = this->unk_160; + AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_iknv_obj_Matanimheader_00F1C0)); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + func_8012C304(POLY_XLU_DISP++); + Scene_SetRenderModeXlu(play, 1, 2); + func_8012C2DC(play->state.gfxCtx); + + gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, (s32)(255.0f * sp54)); + gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_00DDD8); + gDPSetEnvColor(POLY_XLU_DISP++, 215, 42, 55, (s32)(120.0f * sp54)); + gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_00DB60); + + CLOSE_DISPS(gfxCtx); +} + +void func_80BD7768(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + + OPEN_DISPS(play->state.gfxCtx); + + Scene_SetRenderModeXlu(play, 0, 1); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + func_8012C28C(play->state.gfxCtx); + + gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, 255); + gSPDisplayList(POLY_OPA_DISP++, object_iknv_obj_DL_010D98); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void func_80BD7820(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + + OPEN_DISPS(play->state.gfxCtx); + + AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_iknv_obj_Matanimheader_012728)); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + func_8012C2DC(play->state.gfxCtx); + + gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_012700); + + CLOSE_DISPS(play->state.gfxCtx); +} + +void func_80BD78C4(Actor* thisx, PlayState* play) { + BgIknvDoukutu* this = THIS; + f32 sp30 = this->unk_160; + s32 pad; + + OPEN_DISPS(play->state.gfxCtx); + + AnimatedMat_Draw(play, Lib_SegmentedToVirtual(object_iknv_obj_Matanimheader_0117A0)); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + func_8012C2DC(play->state.gfxCtx); + + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 255, (s32)(140.0f * sp30)); + + gSPDisplayList(POLY_XLU_DISP++, object_iknv_obj_DL_0115E0); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h index e1373e8a6..d9c4f78ad 100644 --- a/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h +++ b/src/overlays/actors/ovl_Bg_Iknv_Doukutu/z_bg_iknv_doukutu.h @@ -7,11 +7,21 @@ struct BgIknvDoukutu; typedef void (*BgIknvDoukutuActionFunc)(struct BgIknvDoukutu*, PlayState*); +#define BGIKNVDOUKUTU_GET_F(thisx) ((thisx)->params & 0xF) + +enum { + BGIKNVDOUKUTU_F_0, + BGIKNVDOUKUTU_F_1, + BGIKNVDOUKUTU_F_2, +}; + typedef struct BgIknvDoukutu { - /* 0x0000 */ Actor actor; - /* 0x0144 */ char unk_144[0x20]; - /* 0x0164 */ BgIknvDoukutuActionFunc actionFunc; -} BgIknvDoukutu; // size = 0x168 + /* 0x000 */ DynaPolyActor dyna; + /* 0x15C */ s16 unk_15C; // set and not used + /* 0x15E */ u16 csAction; + /* 0x160 */ f32 unk_160; + /* 0x164 */ BgIknvDoukutuActionFunc actionFunc; +} BgIknvDoukutu;// size = 0x168 extern const ActorInit Bg_Iknv_Doukutu_InitVars; diff --git a/undefined_syms.txt b/undefined_syms.txt index 148e952d6..f160ee701 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -609,19 +609,6 @@ D_06001AD8 = 0x06001AD8; D_06001E18 = 0x06001E18; D_06002358 = 0x06002358; -// ovl_Bg_Iknv_Doukutu - -D_0600DB60 = 0x0600DB60; -D_0600DDD8 = 0x0600DDD8; -D_0600F1C0 = 0x0600F1C0; -D_06010D98 = 0x06010D98; -D_060115E0 = 0x060115E0; -D_060117A0 = 0x060117A0; -D_060117C8 = 0x060117C8; -D_06012700 = 0x06012700; -D_06012728 = 0x06012728; -D_06012788 = 0x06012788; - // ovl_Bg_Kin2_Bombwall D_06000128 = 0x06000128;