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;