From a22e72acfeb2c8185051017e00d0f2b91538e0c7 Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo <96613413+sonicdcer@users.noreply.github.com> Date: Tue, 19 Jul 2022 12:49:07 -0300 Subject: [PATCH] ovl_En_Sekihi Decompiled and Documented (#907) * progress * All functions matching * ovl_En_Sekihi Decompiled and Documented * pr review * pr review * params enum * corrections and renaming * pr review * Update src/overlays/actors/ovl_En_Sekihi/z_en_sekihi.c Co-authored-by: Derek Hensley Co-authored-by: Derek Hensley --- assets/xml/objects/object_sekihig.xml | 22 +-- assets/xml/objects/object_sekihil.xml | 18 +- assets/xml/objects/object_sekihin.xml | 22 +-- assets/xml/objects/object_sekihiz.xml | 10 +- assets/xml/objects/object_zog.xml | 22 +-- spec | 3 +- .../actors/ovl_En_Sekihi/z_en_sekihi.c | 158 ++++++++++++++++-- .../actors/ovl_En_Sekihi/z_en_sekihi.h | 17 +- tools/disasm/functions.txt | 4 +- 9 files changed, 211 insertions(+), 65 deletions(-) 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",),