diff --git a/assets/xml/objects/object_sekihig.xml b/assets/xml/objects/object_sekihig.xml
index dab91d71b2..bb995bed48 100644
--- a/assets/xml/objects/object_sekihig.xml
+++ b/assets/xml/objects/object_sekihig.xml
@@ -1,16 +1,16 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sekihil.xml b/assets/xml/objects/object_sekihil.xml
index e3c7bcc42d..fb9903875f 100644
--- a/assets/xml/objects/object_sekihil.xml
+++ b/assets/xml/objects/object_sekihil.xml
@@ -1,16 +1,16 @@
-
+
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sekihin.xml b/assets/xml/objects/object_sekihin.xml
index f2982169bb..104f5f1333 100644
--- a/assets/xml/objects/object_sekihin.xml
+++ b/assets/xml/objects/object_sekihin.xml
@@ -1,17 +1,17 @@
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_sekihiz.xml b/assets/xml/objects/object_sekihiz.xml
index 0f8ef7c43e..9563d8b420 100644
--- a/assets/xml/objects/object_sekihiz.xml
+++ b/assets/xml/objects/object_sekihiz.xml
@@ -1,9 +1,9 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/assets/xml/objects/object_zog.xml b/assets/xml/objects/object_zog.xml
index 627bb676ad..15265596d9 100644
--- a/assets/xml/objects/object_zog.xml
+++ b/assets/xml/objects/object_zog.xml
@@ -9,17 +9,17 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spec b/spec
index 91212d5ffe..4b1978d38f 100644
--- a/spec
+++ b/spec
@@ -2766,8 +2766,7 @@ beginseg
name "ovl_En_Sekihi"
compress
include "build/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.o"
- include "build/data/ovl_En_Sekihi/ovl_En_Sekihi.data.o"
- include "build/data/ovl_En_Sekihi/ovl_En_Sekihi.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Sekihi/ovl_En_Sekihi_reloc.o"
endseg
beginseg
diff --git a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
index e33da10737..3d43d3a6b8 100644
--- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
+++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c
@@ -5,6 +5,11 @@
*/
#include "z_en_sekihi.h"
+#include "objects/object_sekihil/object_sekihil.h"
+#include "objects/object_sekihig/object_sekihig.h"
+#include "objects/object_sekihin/object_sekihin.h"
+#include "objects/object_sekihiz/object_sekihiz.h"
+#include "objects/object_zog/object_zog.h"
#define FLAGS (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10)
@@ -13,13 +18,12 @@
void EnSekihi_Init(Actor* thisx, PlayState* play);
void EnSekihi_Destroy(Actor* thisx, PlayState* play);
void EnSekihi_Update(Actor* thisx, PlayState* play);
+void EnSekihi_Draw(Actor* thisx, PlayState* play);
void func_80A44DE8(EnSekihi* this, PlayState* play);
-void func_80A44F40(EnSekihi* this, PlayState* play);
void func_80A450B0(EnSekihi* this, PlayState* play);
-void func_80A45130(EnSekihi* this, PlayState* play);
+void EnSekihi_DoNothing(EnSekihi* this, PlayState* play);
-#if 0
const ActorInit En_Sekihi_InitVars = {
ACTOR_EN_SEKIHI,
ACTORCAT_PROP,
@@ -32,20 +36,150 @@ const ActorInit En_Sekihi_InitVars = {
(ActorFunc)NULL,
};
-#endif
+static s16 sObjectIds[] = { OBJECT_SEKIHIL, OBJECT_SEKIHIG, OBJECT_SEKIHIN, OBJECT_SEKIHIZ, OBJECT_ZOG };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/EnSekihi_Init.s")
+static Gfx* sOpaDLists[] = {
+ gGraveTriforceSymbolDL, gGraveGoronSymbolDL, gGraveKokiriSymbolDL, gTombSongOfSoaringDL, gMikauGraveDL,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/EnSekihi_Destroy.s")
+static Gfx* sXluDLists[] = {
+ gSunSongTriforceSymbolDL, gSunSongGoronSymbolDL, gSunSongKokiriSymbolDL, gSekihizEmptyDL, gMikauGraveDirtDL,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/func_80A44DE8.s")
+static u16 sTextIds[] = { 0, 0, 0, 0, 0x1018 };
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/func_80A44F40.s")
+void EnSekihi_Init(Actor* thisx, PlayState* play) {
+ EnSekihi* this = THIS;
+ s32 params = ENSIKIHI_GET_TYPE(thisx);
+ s32 objectIndex;
+ s32 pad;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/func_80A450B0.s")
+ if ((params < SEKIHI_TYPE_0 || params >= SEKIHI_TYPE_MAX) || sOpaDLists[params] == NULL) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ } else {
+ if ((params == SEKIHI_TYPE_4) && (((gSaveContext.save.skullTokenCount & 0xFFFF)) >= 30)) {
+ gSaveContext.save.weekEventReg[13] |= 0x20;
+ }
+ objectIndex = Object_GetIndex(&play->objectCtx, sObjectIds[params]);
+ if (objectIndex >= 0) {
+ this->objectIndex = objectIndex;
+ }
+ this->actionFunc = func_80A44DE8;
+ this->opaDList = sOpaDLists[params];
+ this->xluDList = sXluDLists[params];
+ this->dyna.actor.textId = sTextIds[params];
+ this->dyna.actor.focus.pos.y = this->dyna.actor.world.pos.y + 60.0f;
+ Actor_SetScale(&this->dyna.actor, 0.1f);
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/func_80A45130.s")
+void EnSekihi_Destroy(Actor* thisx, PlayState* play) {
+ EnSekihi* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/EnSekihi_Update.s")
+ DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Sekihi/func_80A45164.s")
+void func_80A44DE8(EnSekihi* this, PlayState* play) {
+ CollisionHeader* colHeader = NULL;
+ s32 params;
+ CollisionHeader* colHeaders[] = {
+ &gSekihilCol, &gSekihigCol, &gSekihinCol, &gSekihizCol, &gObjectZogCol,
+ };
+
+ params = ENSIKIHI_GET_TYPE(&this->dyna.actor);
+ if (Object_IsLoaded(&play->objectCtx, this->objectIndex)) {
+ this->dyna.actor.objBankIndex = this->objectIndex;
+ this->dyna.actor.draw = EnSekihi_Draw;
+ if (params == SEKIHI_TYPE_4) {
+ this->actionFunc = func_80A450B0;
+ } else {
+ this->actionFunc = EnSekihi_DoNothing;
+ }
+
+ Actor_SetObjectDependency(play, &this->dyna.actor);
+ DynaPolyActor_Init(&this->dyna, 0);
+ if (colHeaders[params] != NULL) {
+ CollisionHeader_GetVirtual(colHeaders[params], &colHeader);
+ }
+
+ this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &this->dyna.actor, colHeader);
+ if ((params == SEKIHI_TYPE_4) && (INV_CONTENT(ITEM_MASK_ZORA) != ITEM_MASK_ZORA)) {
+ Actor_MarkForDeath(&this->dyna.actor);
+ }
+ }
+}
+
+void func_80A44F40(EnSekihi* this, PlayState* play) {
+ switch (Message_GetState(&play->msgCtx)) {
+ case 4:
+ if (Message_ShouldAdvance(play) && (play->msgCtx.currentTextId == 0x1019)) {
+ switch (play->msgCtx.choiceIndex) {
+ case 0:
+ func_8019F208();
+ func_80151938(play, 0x101A);
+ break;
+ case 1:
+ func_8019F208();
+ func_80151938(play, 0x101B);
+ break;
+ case 2:
+ func_8019F230();
+ func_801477B4(play);
+ this->actionFunc = func_80A450B0;
+ break;
+ }
+ } else {
+ break;
+ }
+ break;
+ case 5:
+ if (Message_ShouldAdvance(play)) {
+ switch (play->msgCtx.currentTextId) {
+ case 0x1018:
+ func_80151938(play, play->msgCtx.currentTextId + 1);
+ break;
+ case 0x101A:
+ case 0x101B:
+ func_801477B4(play);
+ this->actionFunc = func_80A450B0;
+ break;
+ }
+ }
+ break;
+ }
+}
+
+void func_80A450B0(EnSekihi* this, PlayState* play) {
+ if (Actor_ProcessTalkRequest(&this->dyna.actor, &play->state)) {
+ this->actionFunc = func_80A44F40;
+ } else if ((this->dyna.actor.xzDistToPlayer < 100.0f) && (Player_IsFacingActor(&this->dyna.actor, 0x2600, play))) {
+ func_800B8614(&this->dyna.actor, play, 120.0f);
+ }
+}
+
+void EnSekihi_DoNothing(EnSekihi* this, PlayState* play) {
+}
+
+void EnSekihi_Update(Actor* thisx, PlayState* play) {
+ EnSekihi* this = THIS;
+
+ this->actionFunc(this, play);
+}
+
+void EnSekihi_Draw(Actor* thisx, PlayState* play) {
+ EnSekihi* this = THIS;
+
+ OPEN_DISPS(play->state.gfxCtx);
+
+ if (this->xluDList != NULL) {
+ 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++, this->xluDList);
+ }
+
+ gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
+ func_8012C28C(play->state.gfxCtx);
+ gSPDisplayList(POLY_OPA_DISP++, this->opaDList);
+
+ CLOSE_DISPS(play->state.gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h
index 44d3873e90..e626b616de 100644
--- a/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h
+++ b/src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.h
@@ -3,16 +3,29 @@
#include "global.h"
+#define ENSIKIHI_GET_TYPE(thisx) ((thisx)->params & 0xF)
+
struct EnSekihi;
typedef void (*EnSekihiActionFunc)(struct EnSekihi*, PlayState*);
typedef struct EnSekihi {
- /* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x24];
+ /* 0x000 */ DynaPolyActor dyna;
+ /* 0x15C */ Gfx* opaDList;
+ /* 0x160 */ Gfx* xluDList;
+ /* 0x164 */ s8 objectIndex;
/* 0x168 */ EnSekihiActionFunc actionFunc;
} EnSekihi; // size = 0x16C
+typedef enum SekihiType {
+ /* 0x0 */ SEKIHI_TYPE_0,
+ /* 0x1 */ SEKIHI_TYPE_1,
+ /* 0x2 */ SEKIHI_TYPE_2,
+ /* 0x3 */ SEKIHI_TYPE_3,
+ /* 0x4 */ SEKIHI_TYPE_4,
+ /* 0x5 */ SEKIHI_TYPE_MAX
+} SekihiType;
+
extern const ActorInit En_Sekihi_InitVars;
#endif // Z_EN_SEKIHI_H
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index 935a0b2268..66d8be89ca 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -10436,9 +10436,9 @@
0x80A44DE8:("func_80A44DE8",),
0x80A44F40:("func_80A44F40",),
0x80A450B0:("func_80A450B0",),
- 0x80A45130:("func_80A45130",),
+ 0x80A45130:("EnSekihi_DoNothing",),
0x80A45140:("EnSekihi_Update",),
- 0x80A45164:("func_80A45164",),
+ 0x80A45164:("EnSekihi_Draw",),
0x80A45360:("EnWiz_Init",),
0x80A45568:("EnWiz_Destroy",),
0x80A455C4:("func_80A455C4",),