diff --git a/assets/xml/objects/object_box.xml b/assets/xml/objects/object_box.xml
index 6312622f7c..c1185f237e 100644
--- a/assets/xml/objects/object_box.xml
+++ b/assets/xml/objects/object_box.xml
@@ -22,28 +22,29 @@
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spec b/spec
index 7260f38dc2..8f4c435901 100644
--- a/spec
+++ b/spec
@@ -1225,8 +1225,7 @@ beginseg
name "ovl_Demo_Tre_Lgt"
compress
include "build/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.o"
- include "build/data/ovl_Demo_Tre_Lgt/ovl_Demo_Tre_Lgt.data.o"
- include "build/data/ovl_Demo_Tre_Lgt/ovl_Demo_Tre_Lgt.reloc.o"
+ include "build/src/overlays/actors/ovl_Demo_Tre_Lgt/ovl_Demo_Tre_Lgt_reloc.o"
endseg
beginseg
diff --git a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
index d4ce73419c..15679f3531 100644
--- a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
+++ b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.c
@@ -5,6 +5,8 @@
*/
#include "z_demo_tre_lgt.h"
+#include "../ovl_En_Box/z_en_box.h"
+#include "objects/object_box/object_box.h"
#define FLAGS 0x00000010
@@ -15,7 +17,24 @@ void DemoTreLgt_Destroy(Actor* thisx, GlobalContext* globalCtx);
void DemoTreLgt_Update(Actor* thisx, GlobalContext* globalCtx);
void DemoTreLgt_Draw(Actor* thisx, GlobalContext* globalCtx);
-#if 0
+void DemoTreLgt_SetupWait(DemoTreLgt* this);
+
+void DemoTreLgt_Wait(DemoTreLgt* this, GlobalContext* globalCtx);
+void DemoTreLgt_SetupAnimate(DemoTreLgt* this, GlobalContext* globalCtx, f32 frame);
+void DemoTreLgt_Animate(DemoTreLgt* this, GlobalContext* globalCtx);
+
+typedef struct {
+ f32 unk0;
+ f32 unk4;
+ f32 unk8;
+ f32 unkC;
+} DemoTreLgtInfo;
+
+static DemoTreLgtInfo D_808E1490[2] = {
+ { 1.0f, 136.0f, 190.0f, 40.0f },
+ { 1.0f, 136.0f, 220.0f, 50.0f },
+};
+
const ActorInit Demo_Tre_Lgt_InitVars = {
ACTOR_DEMO_TRE_LGT,
ACTORCAT_ITEMACTION,
@@ -28,24 +47,122 @@ const ActorInit Demo_Tre_Lgt_InitVars = {
(ActorFunc)DemoTreLgt_Draw,
};
-#endif
+static TransformUpdateIndex* sBoxLightAnimations[] = {
+ &gBoxLight0CurveAnim,
+ &gBoxLight1CurveAnim,
+};
-extern UNK_TYPE D_06007D78;
+static DemoTreLgtActionFunc sActionFuncs[] = {
+ DemoTreLgt_Wait,
+ DemoTreLgt_Animate,
+};
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/DemoTreLgt_Init.s")
+void DemoTreLgt_Init(Actor* thisx, GlobalContext* globalCtx) {
+ DemoTreLgt* this = (DemoTreLgt*)thisx;
+ SkelCurve_Init(globalCtx, &this->skelCurve, &gBoxLightCurveSkel, sBoxLightAnimations[0]);
+ this->colorAlpha1 = 255;
+ this->colorAlpha2 = 255;
+ this->status = 0;
+ if (gSaveContext.playerForm == 0) {
+ this->animationType = 0;
+ } else {
+ this->animationType = 1;
+ }
+ DemoTreLgt_SetupWait(this);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/DemoTreLgt_Destroy.s")
+void DemoTreLgt_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ DemoTreLgt* this = (DemoTreLgt*)thisx;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/func_808E0EE8.s")
+ SkelCurve_Destroy(globalCtx, &this->skelCurve);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/func_808E0EF4.s")
+void DemoTreLgt_SetupWait(DemoTreLgt* this) {
+ this->action = DEMO_TRE_LGT_ACTION_WAIT;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/func_808E0F4C.s")
+void DemoTreLgt_Wait(DemoTreLgt* this, GlobalContext* globalCtx) {
+ EnBox* chest = (EnBox*)this->actor.parent;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/func_808E0FE0.s")
+ if (chest != NULL) {
+ if (Animation_OnFrame(&chest->skelAnime, 10.0f) != 0) {
+ DemoTreLgt_SetupAnimate(this, globalCtx, chest->skelAnime.curFrame);
+ }
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/DemoTreLgt_Update.s")
+void DemoTreLgt_SetupAnimate(DemoTreLgt* this, GlobalContext* globalCtx, f32 frame) {
+ this->action = DEMO_TRE_LGT_ACTION_ANIMATE;
+ SkelCurve_SetAnim(&this->skelCurve, sBoxLightAnimations[this->animationType], 1.0f,
+ D_808E1490[this->animationType].unk4 + D_808E1490[this->animationType].unk8, frame, 1.0f);
+ SkelCurve_Update(globalCtx, &this->skelCurve);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/func_808E12A4.s")
+void DemoTreLgt_Animate(DemoTreLgt* this, GlobalContext* globalCtx) {
+ f32 curFrame = this->skelCurve.animCurFrame;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Demo_Tre_Lgt/DemoTreLgt_Draw.s")
+ if (curFrame < D_808E1490[this->animationType].unk4) {
+ this->colorAlpha1 = 255;
+ } else if (curFrame <= (D_808E1490[this->animationType].unk4 + D_808E1490[this->animationType].unk8)) {
+ this->colorAlpha1 = ((D_808E1490[this->animationType].unk4 - curFrame) / D_808E1490[this->animationType].unk8) * 255 + 255;
+ } else {
+ this->colorAlpha1 = 0;
+ }
+
+ if (curFrame < D_808E1490[this->animationType].unkC) {
+ this->colorAlpha2 = 255;
+ } else if (curFrame < (D_808E1490[this->animationType].unkC + 10.0f)) {
+ this->colorAlpha2 = ((D_808E1490[this->animationType].unkC - curFrame) / 10.0f) * 255 + 255;
+ } else {
+ this->colorAlpha2 = 0;
+ }
+ if (curFrame > 30.0f) {
+ if (!(this->status & 1)) {
+ this->status |= 1;
+ Audio_PlaySfxAtPos(&this->actor.projectedPos, NA_SE_EV_TRE_BOX_FLASH);
+ }
+ }
+ if (SkelCurve_Update(globalCtx, &this->skelCurve) != 0) {
+ Actor_MarkForDeath(&this->actor);
+ }
+}
+
+void DemoTreLgt_Update(Actor* thisx, GlobalContext* globalCtx) {
+ DemoTreLgt* this = (DemoTreLgt*)thisx;
+
+ sActionFuncs[this->action](this, globalCtx);
+}
+
+s32 DemoTreLgt_OverrideLimbDraw(GlobalContext* globalCtx, SkelAnimeCurve* skelCuve, s32 limbIndex, Actor* thisx) {
+ s32 pad;
+ DemoTreLgt* this = (DemoTreLgt*)thisx;
+
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+
+ gSPSegment(POLY_XLU_DISP++, 0x08,
+ Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, (globalCtx->state.frames * 2) % 256, 0, 64, 32, 1,
+ (globalCtx->state.frames * -2) % 256, 0, 64, 32));
+
+ if (limbIndex == 1) {
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 180, this->colorAlpha1);
+ } else if (limbIndex == 13 || limbIndex == 7 || limbIndex == 4 || limbIndex == 10) {
+ gDPSetPrimColor(POLY_XLU_DISP++, 0, 0x80, 255, 255, 180, this->colorAlpha2);
+ }
+
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+
+ return true;
+}
+
+void DemoTreLgt_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ GraphicsContext* gfxCtx = globalCtx->state.gfxCtx;
+ DemoTreLgt* this = (DemoTreLgt*)thisx;
+
+ OPEN_DISPS(gfxCtx);
+ if (this->action == DEMO_TRE_LGT_ACTION_ANIMATE) {
+ func_8012C2DC(gfxCtx);
+ gDPSetEnvColor(POLY_XLU_DISP++, 200, 255, 0, 0);
+ SkelCurve_Draw(&this->actor, globalCtx, &this->skelCurve, DemoTreLgt_OverrideLimbDraw, NULL, 1, &this->actor);
+ }
+ CLOSE_DISPS(gfxCtx);
+}
diff --git a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.h b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.h
index 07e2a9bc8b..08677b803e 100644
--- a/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.h
+++ b/src/overlays/actors/ovl_Demo_Tre_Lgt/z_demo_tre_lgt.h
@@ -5,11 +5,23 @@
struct DemoTreLgt;
+typedef void (*DemoTreLgtActionFunc)(struct DemoTreLgt* this, GlobalContext* globalCtx);
+
typedef struct DemoTreLgt {
/* 0x000 */ Actor actor;
- /* 0x144 */ char unk_144[0x34];
+ /* 0x144 */ SkelAnimeCurve skelCurve;
+ /* 0x164 */ s32 action;
+ /* 0x168 */ u32 colorAlpha1;
+ /* 0x16C */ u32 colorAlpha2;
+ /* 0x170 */ u8 status;
+ /* 0x174 */ s32 animationType;
} DemoTreLgt; // size = 0x178
+typedef enum {
+ /* 0x00 */ DEMO_TRE_LGT_ACTION_WAIT, // wait until animation is needed
+ /* 0x01 */ DEMO_TRE_LGT_ACTION_ANIMATE
+} DemoTreLgtAction;
+
extern const ActorInit Demo_Tre_Lgt_InitVars;
#endif // Z_DEMO_TRE_LGT_H
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index 72d21b5bc0..69d387c20f 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -6508,12 +6508,12 @@
0x808E0DA8:("EnEncount1_Update",),
0x808E0E40:("DemoTreLgt_Init",),
0x808E0EBC:("DemoTreLgt_Destroy",),
- 0x808E0EE8:("func_808E0EE8",),
- 0x808E0EF4:("func_808E0EF4",),
- 0x808E0F4C:("func_808E0F4C",),
- 0x808E0FE0:("func_808E0FE0",),
+ 0x808E0EE8:("DemoTreLgt_SetupWait",),
+ 0x808E0EF4:("DemoTreLgt_Wait",),
+ 0x808E0F4C:("DemoTreLgt_SetupAnimate",),
+ 0x808E0FE0:("DemoTreLgt_Animate",),
0x808E1270:("DemoTreLgt_Update",),
- 0x808E12A4:("func_808E12A4",),
+ 0x808E12A4:("DemoTreLgt_OverrideLimbDraw",),
0x808E13FC:("DemoTreLgt_Draw",),
0x808E1560:("EnEncount2_Init",),
0x808E16B4:("EnEncount2_Destroy",),
diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt
index 73afcda755..dd7df18da7 100644
--- a/tools/disasm/variables.txt
+++ b/tools/disasm/variables.txt
@@ -7205,8 +7205,8 @@
0x808E0DF8:("D_808E0DF8","UNK_TYPE1","",0x1),
0x808E1490:("D_808E1490","UNK_TYPE1","",0x1),
0x808E14B0:("Demo_Tre_Lgt_InitVars","UNK_TYPE1","",0x1),
- 0x808E14D0:("D_808E14D0","UNK_TYPE4","",0x4),
- 0x808E14D8:("D_808E14D8","UNK_TYPE1","",0x1),
+ 0x808E14D0:("sBoxLightAnimations","UNK_TYPE4","[2]",0x8),
+ 0x808E14D8:("sActionFuncs","UNK_TYPE4","[2]",0x8),
0x808E1ED0:("En_Encount2_InitVars","UNK_TYPE1","",0x1),
0x808E1EF0:("D_808E1EF0","UNK_TYPE1","",0x1),
0x808E1F14:("D_808E1F14","UNK_TYPE1","",0x1),