diff --git a/assets/xml/objects/object_drs.xml b/assets/xml/objects/object_drs.xml
index 35202d17bf..c5f4ee7261 100644
--- a/assets/xml/objects/object_drs.xml
+++ b/assets/xml/objects/object_drs.xml
@@ -1,20 +1,21 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/xml/objects/object_msmo.xml b/assets/xml/objects/object_msmo.xml
index cb08f53ef6..6bfd0e46d9 100644
--- a/assets/xml/objects/object_msmo.xml
+++ b/assets/xml/objects/object_msmo.xml
@@ -1,9 +1,10 @@
+
-
-
-
-
-
+
+
+
+
+
diff --git a/spec b/spec
index 5578d5a4d7..f28afd8bbe 100644
--- a/spec
+++ b/spec
@@ -5308,8 +5308,7 @@ beginseg
name "ovl_En_Drs"
compress
include "build/src/overlays/actors/ovl_En_Drs/z_en_drs.o"
- include "build/data/ovl_En_Drs/ovl_En_Drs.data.o"
- include "build/data/ovl_En_Drs/ovl_En_Drs.reloc.o"
+ include "build/src/overlays/actors/ovl_En_Drs/ovl_En_Drs_reloc.o"
endseg
beginseg
diff --git a/src/overlays/actors/ovl_En_Drs/z_en_drs.c b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
index 81acb58cf5..8643dfa91a 100644
--- a/src/overlays/actors/ovl_En_Drs/z_en_drs.c
+++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.c
@@ -1,7 +1,7 @@
/*
* File: z_en_drs.c
* Overlay: ovl_En_Drs
- * Description: Wedding dress manequin
+ * Description: Anju's Wedding Dress Mannequin
*/
#include "z_en_drs.h"
@@ -13,11 +13,10 @@
void EnDrs_Init(Actor* thisx, GlobalContext* globalCtx);
void EnDrs_Destroy(Actor* thisx, GlobalContext* globalCtx);
void EnDrs_Update(Actor* thisx, GlobalContext* globalCtx);
+void EnDrs_Draw(Actor* thisx, GlobalContext* globalCtx);
-void func_80C1E2D4(EnDrs* this, GlobalContext* globalCtx);
-void func_80C1E3DC(EnDrs* this, GlobalContext* globalCtx);
+void EnDrs_Idle(EnDrs* this, GlobalContext* globalCtx);
-#if 0
const ActorInit En_Drs_InitVars = {
ACTOR_EN_DRS,
ACTORCAT_PROP,
@@ -30,36 +29,98 @@ const ActorInit En_Drs_InitVars = {
(ActorFunc)NULL,
};
-// static ColliderCylinderInit sCylinderInit = {
-static ColliderCylinderInit D_80C1E5E0 = {
- { COLTYPE_HIT1, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, },
- { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_NONE, OCELEM_ON, },
+static ColliderCylinderInit sCylinderInit = {
+ {
+ COLTYPE_HIT1,
+ AT_NONE,
+ AC_NONE,
+ OC1_ON | OC1_TYPE_ALL,
+ OC2_TYPE_1,
+ COLSHAPE_CYLINDER,
+ },
+ {
+ ELEMTYPE_UNK1,
+ { 0x00000000, 0x00, 0x00 },
+ { 0x00000000, 0x00, 0x00 },
+ TOUCH_NONE | TOUCH_SFX_NORMAL,
+ BUMP_NONE,
+ OCELEM_ON,
+ },
{ 16, 62, 0, { 0, 0, 0 } },
};
-// sColChkInfoInit
-static CollisionCheckInfoInit2 D_80C1E60C = { 0, 0, 0, 0, MASS_IMMOVABLE };
+static CollisionCheckInfoInit2 sColChkInfoInit = { 0, 0, 0, 0, MASS_IMMOVABLE };
-#endif
+static AnimationInfoS sAnimations = { &gWeddingDressMannequinIdleAnim, 1.0f, 0, -1, ANIMMODE_LOOP, 0 };
-extern ColliderCylinderInit D_80C1E5E0;
-extern CollisionCheckInfoInit2 D_80C1E60C;
+void EnDrs_CollisionUpdate(EnDrs* this, GlobalContext* globalCtx) {
+ Collider_UpdateCylinder(&this->actor, &this->collider);
+ CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base);
+}
-extern UNK_TYPE D_06000E70;
-extern UNK_TYPE D_06005A78;
+void EnDrs_Setup(EnDrs* this, GlobalContext* globalCtx) {
+ s32 pad[2];
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/func_80C1E290.s")
+ if ((this->moonMaskObjBankIndex >= 0) && SubS_IsObjectLoaded(this->moonMaskObjBankIndex, globalCtx)) {
+ ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f);
+ SkelAnime_InitFlex(globalCtx, &this->skelAnime, &gWeddingDressMannequinSkel, NULL, this->jointTable,
+ this->morphTable, WEDDING_DRESS_MANNEQUIN_LIMB_MAX);
+ SubS_ChangeAnimationByInfoS(&this->skelAnime, &sAnimations, 0);
+ Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit);
+ CollisionCheck_SetInfo2(&this->actor.colChkInfo, DamageTable_Get(0x16), &sColChkInfoInit);
+ Actor_SetScale(&this->actor, 0.01f);
+ this->actor.draw = EnDrs_Draw;
+ this->actionFunc = EnDrs_Idle;
+ }
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/func_80C1E2D4.s")
+void EnDrs_Idle(EnDrs* this, GlobalContext* globalCtx) {
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/func_80C1E3DC.s")
+void EnDrs_Init(Actor* thisx, GlobalContext* globalCtx) {
+ EnDrs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/EnDrs_Init.s")
+ this->moonMaskObjBankIndex = SubS_GetObjectIndex(OBJECT_MSMO, globalCtx);
+ this->actionFunc = EnDrs_Setup;
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/EnDrs_Destroy.s")
+void EnDrs_Destroy(Actor* thisx, GlobalContext* globalCtx) {
+ EnDrs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/EnDrs_Update.s")
+ Collider_DestroyCylinder(globalCtx, &this->collider);
+}
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/func_80C1E4B0.s")
+void EnDrs_Update(Actor* thisx, GlobalContext* globalCtx) {
+ EnDrs* this = THIS;
-#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Drs/func_80C1E568.s")
+ this->actionFunc(this, globalCtx);
+ if (this->actor.draw != NULL) {
+ SkelAnime_Update(&this->skelAnime);
+ EnDrs_CollisionUpdate(this, globalCtx);
+ }
+}
+
+void EnDrs_PostLimbDraw(GlobalContext* globalCtx2, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) {
+ EnDrs* this = THIS;
+ GlobalContext* globalCtx = globalCtx2;
+ s8 temp = this->moonMaskObjBankIndex;
+ s8 temp2 = this->actor.objBankIndex;
+
+ // Anju removes the Moon Mask at the start of the Couple's Mask cutscene
+ // after that it will no longer be rendered.
+ if (!(gSaveContext.weekEventReg[87] & 2) && (limbIndex == WEDDING_DRESS_MANNEQUIN_LIMB_MASK)) {
+ OPEN_DISPS(globalCtx->state.gfxCtx);
+ gSPSegment(POLY_OPA_DISP++, 0x06, globalCtx->objectCtx.status[temp].segment);
+ gSPDisplayList(POLY_OPA_DISP++, &gMoonMaskDL);
+ gSPSegment(POLY_OPA_DISP++, 0x06, globalCtx->objectCtx.status[temp2].segment);
+ CLOSE_DISPS(globalCtx->state.gfxCtx);
+ }
+}
+
+void EnDrs_Draw(Actor* thisx, GlobalContext* globalCtx) {
+ EnDrs* this = THIS;
+
+ func_8012C5B0(globalCtx->state.gfxCtx);
+ SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount,
+ NULL, EnDrs_PostLimbDraw, &this->actor);
+}
diff --git a/src/overlays/actors/ovl_En_Drs/z_en_drs.h b/src/overlays/actors/ovl_En_Drs/z_en_drs.h
index 191f272d6e..1f59d601bf 100644
--- a/src/overlays/actors/ovl_En_Drs/z_en_drs.h
+++ b/src/overlays/actors/ovl_En_Drs/z_en_drs.h
@@ -2,17 +2,22 @@
#define Z_EN_DRS_H
#include "global.h"
+#include "objects/object_drs/object_drs.h"
+#include "objects/object_msmo/object_msmo.h"
struct EnDrs;
typedef void (*EnDrsActionFunc)(struct EnDrs*, GlobalContext*);
typedef struct EnDrs {
- /* 0x0000 */ Actor actor;
- /* 0x0144 */ char unk_144[0x44];
- /* 0x0188 */ EnDrsActionFunc actionFunc;
- /* 0x018C */ char unk_18C[0x80];
-} EnDrs; // size = 0x20C
+ /* 0x000 */ Actor actor;
+ /* 0x144 */ SkelAnime skelAnime;
+ /* 0x188 */ EnDrsActionFunc actionFunc;
+ /* 0x18C */ ColliderCylinder collider;
+ /* 0x1D8 */ Vec3s jointTable[WEDDING_DRESS_MANNEQUIN_LIMB_MAX];
+ /* 0x1F0 */ Vec3s morphTable[WEDDING_DRESS_MANNEQUIN_LIMB_MAX];
+ /* 0x208 */ s8 moonMaskObjBankIndex;
+} EnDrs; // size = 0x20C */
extern const ActorInit En_Drs_InitVars;
diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt
index b0efebcdf8..add2c9dafb 100644
--- a/tools/disasm/functions.txt
+++ b/tools/disasm/functions.txt
@@ -16974,14 +16974,14 @@
0x80C1E108:("DmNb_Update",),
0x80C1E168:("DmNb_TransformLimbDraw",),
0x80C1E17C:("DmNb_Draw",),
- 0x80C1E290:("func_80C1E290",),
- 0x80C1E2D4:("func_80C1E2D4",),
- 0x80C1E3DC:("func_80C1E3DC",),
+ 0x80C1E290:("EnDrs_CollisionUpdate",),
+ 0x80C1E2D4:("EnDrs_Setup",),
+ 0x80C1E3DC:("EnDrs_Idle",),
0x80C1E3EC:("EnDrs_Init",),
0x80C1E424:("EnDrs_Destroy",),
0x80C1E450:("EnDrs_Update",),
- 0x80C1E4B0:("func_80C1E4B0",),
- 0x80C1E568:("func_80C1E568",),
+ 0x80C1E4B0:("EnDrs_PostLimbDraw",),
+ 0x80C1E568:("EnDrs_Draw",),
0x80C1E690:("EnEndingHero_Init",),
0x80C1E738:("EnEndingHero_Destroy",),
0x80C1E748:("func_80C1E748",),
diff --git a/undefined_syms.txt b/undefined_syms.txt
index d0ef176fd1..52b9e239ed 100644
--- a/undefined_syms.txt
+++ b/undefined_syms.txt
@@ -1272,11 +1272,6 @@ D_801C20C0 = 0x801C20C0;
D_06004398 = 0x06004398;
D_060048B8 = 0x060048B8;
-// ovl_En_Drs
-
-D_06000E70 = 0x06000E70;
-D_06005A78 = 0x06005A78;
-
// ovl_En_Ds2n
D_06008038 = 0x06008038;