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",),