From a6bec3ecc279b3bd6a5a2af5628f7ac99b2e5099 Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo <96613413+sonicdcer@users.noreply.github.com> Date: Sun, 7 Aug 2022 19:52:01 -0300 Subject: [PATCH] ovl_En_Test2 Decompiled (#968) * all functions matching * all functions matching * data problem * ovl_En_Test2 Decompiled * format + fix constants * final details * pr review * pr review * pr review --- assets/xml/objects/object_hakugin_obj.xml | 14 +-- spec | 3 +- src/overlays/actors/ovl_En_Test2/z_en_test2.c | 114 ++++++++++++++++-- src/overlays/actors/ovl_En_Test2/z_en_test2.h | 7 +- tools/disasm/functions.txt | 4 +- 5 files changed, 121 insertions(+), 21 deletions(-) diff --git a/assets/xml/objects/object_hakugin_obj.xml b/assets/xml/objects/object_hakugin_obj.xml index 412d0bdd3e..b4badbd1de 100644 --- a/assets/xml/objects/object_hakugin_obj.xml +++ b/assets/xml/objects/object_hakugin_obj.xml @@ -6,37 +6,37 @@ - + - + - + - + - + - + - + diff --git a/spec b/spec index 8b764625fb..c047134a7e 100644 --- a/spec +++ b/spec @@ -2721,8 +2721,7 @@ beginseg name "ovl_En_Test2" compress include "build/src/overlays/actors/ovl_En_Test2/z_en_test2.o" - include "build/data/ovl_En_Test2/ovl_En_Test2.data.o" - include "build/data/ovl_En_Test2/ovl_En_Test2.reloc.o" + include "build/src/overlays/actors/ovl_En_Test2/ovl_En_Test2_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Test2/z_en_test2.c b/src/overlays/actors/ovl_En_Test2/z_en_test2.c index 962925216e..4a051fc235 100644 --- a/src/overlays/actors/ovl_En_Test2/z_en_test2.c +++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.c @@ -5,6 +5,12 @@ */ #include "z_en_test2.h" +#include "objects/object_dekucity_ana_obj/object_dekucity_ana_obj.h" +#include "objects/object_sichitai_obj/object_sichitai_obj.h" +#include "objects/object_yukimura_obj/object_yukimura_obj.h" +#include "objects/object_hakugin_obj/object_hakugin_obj.h" +#include "objects/object_meganeana_obj/object_meganeana_obj.h" +#include "objects/object_haka_obj/object_haka_obj.h" #define FLAGS (ACTOR_FLAG_10 | ACTOR_FLAG_80) @@ -12,8 +18,15 @@ void EnTest2_Init(Actor* thisx, PlayState* play); void EnTest2_Update(Actor* thisx, PlayState* play); +void EnTest2_UpdateForLens(Actor* thisx, PlayState* play); +void EnTest2_Draw(Actor* thisx, PlayState* play); + +typedef struct EnTest2ModelInfo { + /* 0x0 */ Gfx* dList1; + /* 0x4 */ Gfx* dList2; + /* 0x8 */ AnimatedMaterial* animMat; +} EnTest2ModelInfo; // size = 0xC -#if 0 const ActorInit En_Test2_InitVars = { ACTOR_EN_TEST2, ACTORCAT_BG, @@ -26,22 +39,105 @@ const ActorInit En_Test2_InitVars = { (ActorFunc)NULL, }; -// static InitChainEntry sInitChain[] = { -static InitChainEntry D_80A3E74C[] = { +static EnTest2ModelInfo sModelInfo[] = { + { object_dekucity_ana_obj_DL_000040, NULL, NULL }, + { object_sichitai_obj_DL_001820, NULL, NULL }, + { object_yukimura_obj_DL_0008C0, NULL, NULL }, + { object_hakugin_obj_DL_0016D8, NULL, object_hakugin_obj_Matanimheader_0017A8 }, + { object_hakugin_obj_DL_002018, NULL, object_hakugin_obj_Matanimheader_0020E8 }, + { object_hakugin_obj_DL_005268, NULL, object_hakugin_obj_Matanimheader_005338 }, + { object_meganeana_obj_DL_000110, object_meganeana_obj_DL_000080, NULL }, + { object_haka_obj_DL_000F70, NULL, NULL }, + { object_haka_obj_DL_001200, NULL, NULL }, + { object_hakugin_obj_DL_004928, NULL, object_hakugin_obj_Matanimheader_0049F8 }, + { object_hakugin_obj_DL_002978, NULL, object_hakugin_obj_Matanimheader_002A58 }, + { object_hakugin_obj_DL_000D38, NULL, object_hakugin_obj_Matanimheader_000E48 }, + { object_hakugin_obj_DL_0035A8, NULL, object_hakugin_obj_Matanimheader_003888 }, +}; + +static InitChainEntry sInitChain[] = { ICHAIN_VEC3F(scale, 1, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneForward, 8000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 800, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneDownward, 2500, ICHAIN_STOP), }; -#endif +static s16 sObjectIds[] = { + OBJECT_DEKUCITY_ANA_OBJ, OBJECT_SICHITAI_OBJ, OBJECT_YUKIMURA_OBJ, OBJECT_HAKUGIN_OBJ, OBJECT_HAKUGIN_OBJ, + OBJECT_HAKUGIN_OBJ, OBJECT_MEGANEANA_OBJ, OBJECT_HAKA_OBJ, OBJECT_HAKA_OBJ, OBJECT_HAKUGIN_OBJ, + OBJECT_HAKUGIN_OBJ, OBJECT_HAKUGIN_OBJ, OBJECT_HAKUGIN_OBJ, +}; -extern InitChainEntry D_80A3E74C[]; +void EnTest2_Init(Actor* thisx, PlayState* play) { + EnTest2* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Test2/EnTest2_Init.s") + Actor_ProcessInitChain(&this->actor, sInitChain); + if ((this->actor.params == EN_TEST2_PARAMS_B) || (this->actor.params == EN_TEST2_PARAMS_C)) { + this->actor.flags |= ACTOR_FLAG_20; + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Test2/EnTest2_Update.s") +void EnTest2_Update(Actor* thisx, PlayState* play) { + s32 pad; + s32 objectIndex; + EnTest2ModelInfo* modelInfo; + EnTest2* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Test2/func_80A3E4EC.s") + objectIndex = Object_GetIndex(&play->objectCtx, sObjectIds[this->actor.params]); + if (objectIndex < 0) { + Actor_MarkForDeath(&this->actor); + return; + } + if (Object_IsLoaded(&play->objectCtx, objectIndex)) { + modelInfo = &sModelInfo[this->actor.params]; + this->actor.objBankIndex = objectIndex; + this->actor.draw = EnTest2_Draw; + if (modelInfo->animMat != NULL) { + Actor_SetObjectDependency(play, &this->actor); + this->animMat = Lib_SegmentedToVirtual(modelInfo->animMat); + } + if (play->roomCtx.currRoom.unk5) { + this->actor.update = EnTest2_UpdateForLens; + } else { + this->actor.update = Actor_Noop; + } + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Test2/func_80A3E524.s") +void EnTest2_UpdateForLens(Actor* thisx, PlayState* play) { + EnTest2* this = THIS; + + if (play->actorCtx.unk4 == 100) { + this->actor.flags |= ACTOR_FLAG_80; + } else { + this->actor.flags &= ~ACTOR_FLAG_80; + } +} + +void EnTest2_Draw(Actor* thisx, PlayState* play) { + s32 pad; + EnTest2* this = THIS; + Gfx* dList = sModelInfo[this->actor.params].dList2; + + if (this->animMat != NULL) { + AnimatedMat_Draw(play, this->animMat); + } + if (CHECK_FLAG_ALL(this->actor.flags, ACTOR_FLAG_80)) { + OPEN_DISPS(play->state.gfxCtx); + + func_8012C2DC(play->state.gfxCtx); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (dList != NULL) { + gSPDisplayList(POLY_XLU_DISP++, dList); + } + gSPDisplayList(POLY_XLU_DISP++, sModelInfo[this->actor.params].dList1); + + CLOSE_DISPS(play->state.gfxCtx); + } else { + if (dList != NULL) { + Gfx_DrawDListXlu(play, dList); + } + Gfx_DrawDListOpa(play, sModelInfo[this->actor.params].dList1); + } +} diff --git a/src/overlays/actors/ovl_En_Test2/z_en_test2.h b/src/overlays/actors/ovl_En_Test2/z_en_test2.h index b8eabec2c5..ccbba11e74 100644 --- a/src/overlays/actors/ovl_En_Test2/z_en_test2.h +++ b/src/overlays/actors/ovl_En_Test2/z_en_test2.h @@ -7,9 +7,14 @@ struct EnTest2; typedef struct EnTest2 { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x4]; + /* 0x144 */ AnimatedMaterial* animMat; } EnTest2; // size = 0x148 +typedef enum { + /* 0xB */ EN_TEST2_PARAMS_B = 0xB, + /* 0xC */ EN_TEST2_PARAMS_C +} EnTest2_Params; + extern const ActorInit En_Test2_InitVars; #endif // Z_EN_TEST2_H diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index a10ae84cac..5e821331d6 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -10347,8 +10347,8 @@ 0x80A3E248:("ObjSmork_Draw",), 0x80A3E390:("EnTest2_Init",), 0x80A3E3E4:("EnTest2_Update",), - 0x80A3E4EC:("func_80A3E4EC",), - 0x80A3E524:("func_80A3E524",), + 0x80A3E4EC:("EnTest2_UpdateForLens",), + 0x80A3E524:("EnTest2_Draw",), 0x80A3E7E0:("func_80A3E7E0",), 0x80A3E80C:("func_80A3E80C",), 0x80A3E870:("func_80A3E870",),