diff --git a/assets/xml/objects/object_al.xml b/assets/xml/objects/object_al.xml index d0f6a6cbb1..dc28bcf6bb 100644 --- a/assets/xml/objects/object_al.xml +++ b/assets/xml/objects/object_al.xml @@ -1,71 +1,71 @@  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spec b/spec index 90bf986e5b..56e5b4b95a 100644 --- a/spec +++ b/spec @@ -5069,8 +5069,7 @@ beginseg name "ovl_Dm_Al" compress include "build/src/overlays/actors/ovl_Dm_Al/z_dm_al.o" - include "build/data/ovl_Dm_Al/ovl_Dm_Al.data.o" - include "build/data/ovl_Dm_Al/ovl_Dm_Al.reloc.o" + include "build/src/overlays/actors/ovl_Dm_Al/ovl_Dm_Al_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c index a19de97b08..ce3e18ab22 100644 --- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.c +++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.c @@ -15,9 +15,6 @@ void DmAl_Destroy(Actor* thisx, PlayState* play); void DmAl_Update(Actor* thisx, PlayState* play); void DmAl_Draw(Actor* thisx, PlayState* play); -void func_80C1BDD8(DmAl* this, PlayState* play); - -#if 0 const ActorInit Dm_Al_InitVars = { ACTOR_EN_AL, ACTORCAT_NPC, @@ -30,24 +27,135 @@ const ActorInit Dm_Al_InitVars = { (ActorFunc)DmAl_Draw, }; -#endif +static AnimationInfoS sAnimationInfos[] = { + { &object_al_Anim_00DBE0, 1.0f, 0, -1, ANIMMODE_LOOP, 0 }, +}; -extern UNK_TYPE D_0600A0D8; +s32 DmAl_ChangeAnimation(DmAl* this, s32 animationIndex) { + s32 didAnimationChange = false; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/func_80C1BD90.s") + if (animationIndex != this->animationIndex) { + this->animationIndex = animationIndex; + didAnimationChange = SubS_ChangeAnimationByInfoS(&this->skelAnime, sAnimationInfos, animationIndex); + } + return didAnimationChange; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/func_80C1BDD8.s") +void func_80C1BDD8(DmAl* this, PlayState* play) { + s32 D_80C1C280[] = { 0, 0, 0, 0, 0 }; + u16 csAction; + s32 actionIndex; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/DmAl_Init.s") + if (play->csCtx.state != 0) { + if (!this->unk_45C) { + this->action = 0xFF; + this->unk_45C = true; + this->animationIndex2 = this->animationIndex; + } + if (Cutscene_CheckActorAction(play, 0x232)) { + actionIndex = Cutscene_GetActorActionIndex(play, 0x232); + csAction = play->csCtx.actorActions[actionIndex]->action; + if (this->action != (u8)csAction) { + this->action = csAction; + DmAl_ChangeAnimation(this, D_80C1C280[csAction]); + } + Cutscene_ActorTranslateAndYaw(&this->actor, play, actionIndex); + } + } else if (this->unk_45C) { + this->unk_45C = false; + DmAl_ChangeAnimation(this, this->animationIndex2); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/DmAl_Destroy.s") +void DmAl_Init(Actor* thisx, PlayState* play) { + DmAl* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/DmAl_Update.s") + ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f); + SkelAnime_InitFlex(play, &this->skelAnime, &gMadameAromaSkel, NULL, this->jointTable, this->morphTable, + MADAME_AROMA_LIMB_MAX); + this->animationIndex = -1; + DmAl_ChangeAnimation(this, MADAME_AROMA_ANIMATION_0); + this->actor.flags &= ~ACTOR_FLAG_1; + Actor_SetScale(&this->actor, 0.01f); + this->actionFunc = func_80C1BDD8; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/func_80C1C028.s") +void DmAl_Destroy(Actor* thisx, PlayState* play) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/func_80C1C064.s") +void DmAl_Update(Actor* thisx, PlayState* play) { + DmAl* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/func_80C1C11C.s") + this->actionFunc(this, play); + SkelAnime_Update(&this->skelAnime); + Actor_UpdateBgCheckInfo(play, &this->actor, 30.0f, 12.0f, 0.0f, 4); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Dm_Al/DmAl_Draw.s") +s32 DmAl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* rot, Vec3s* pos, Actor* thisx) { + switch (limbIndex) { + case MADAME_AROMA_LIMB_SHAWL_MIDDLE: + case MADAME_AROMA_LIMB_SHAWL_UPPER: + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER_MIDDLE: + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER: + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER_MIDDLE: + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER: + *dList = NULL; + break; + } + return false; +} + +void DmAl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + DmAl* this = THIS; + + switch (limbIndex) { + case MADAME_AROMA_LIMB_SHAWL_MIDDLE: + Matrix_Get(&this->shawlMatrices[0]); + break; + case MADAME_AROMA_LIMB_SHAWL_UPPER: + Matrix_Get(&this->shawlMatrices[1]); + break; + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER_MIDDLE: + Matrix_Get(&this->shawlMatrices[2]); + break; + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER: + Matrix_Get(&this->shawlMatrices[3]); + break; + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER_MIDDLE: + Matrix_Get(&this->shawlMatrices[4]); + break; + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER: + Matrix_Get(&this->shawlMatrices[5]); + break; + default: + break; + } +} + +void DmAl_TransformLimbDraw(PlayState* play, s32 limbIndex, Actor* thisx) { +} + +static Gfx* sDlists[] = { + gMadameAromaShawlMiddleDL, gMadameAromaShawlUpperDL, + gMadameAromaShawlLeftLowerMiddleDL, gMadameAromaShawlLeftLowerDL, + gMadameAromaShawlRightLowerMiddleDL, gMadameAromaShawlRightLowerDL, +}; + +void DmAl_Draw(Actor* thisx, PlayState* play) { + u32 i; + DmAl* this = THIS; + + OPEN_DISPS(play->state.gfxCtx); + + func_8012C28C(play->state.gfxCtx); + SkelAnime_DrawTransformFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, + this->skelAnime.dListCount, DmAl_OverrideLimbDraw, DmAl_PostLimbDraw, + DmAl_TransformLimbDraw, &this->actor); + for (i = 0; i < ARRAY_COUNT(this->shawlMatrices); i++) { + Matrix_Put(&this->shawlMatrices[i]); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, sDlists[i]); + } + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Dm_Al/z_dm_al.h b/src/overlays/actors/ovl_Dm_Al/z_dm_al.h index 6387511df7..f15513177c 100644 --- a/src/overlays/actors/ovl_Dm_Al/z_dm_al.h +++ b/src/overlays/actors/ovl_Dm_Al/z_dm_al.h @@ -2,6 +2,7 @@ #define Z_DM_AL_H #include "global.h" +#include "objects/object_al/object_al.h" struct DmAl; @@ -9,11 +10,22 @@ typedef void (*DmAlActionFunc)(struct DmAl*, PlayState*); typedef struct DmAl { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x44]; + /* 0x144 */ SkelAnime skelAnime; /* 0x188 */ DmAlActionFunc actionFunc; - /* 0x18C */ char unk_18C[0x2D4]; + /* 0x18C */ MtxF shawlMatrices[6]; + /* 0x30C */ Vec3s jointTable[MADAME_AROMA_LIMB_MAX]; + /* 0x3AE */ Vec3s morphTable[MADAME_AROMA_LIMB_MAX]; + /* 0x450 */ u8 action; + /* 0x454 */ s32 animationIndex; + /* 0x458 */ s32 animationIndex2; + /* 0x45C */ s32 unk_45C; } DmAl; // size = 0x460 +typedef enum { + /* 0x0 */ MADAME_AROMA_ANIMATION_0, + /* 0x1 */ MADAME_AROMA_ANIMATION_1 +} DmAlAnimations; + extern const ActorInit Dm_Al_InitVars; #endif // Z_DM_AL_H diff --git a/src/overlays/actors/ovl_En_Al/z_en_al.c b/src/overlays/actors/ovl_En_Al/z_en_al.c index ca51389710..8b56bdc644 100644 --- a/src/overlays/actors/ovl_En_Al/z_en_al.c +++ b/src/overlays/actors/ovl_En_Al/z_en_al.c @@ -129,8 +129,9 @@ static AnimationInfoS sAnimations[] = { Vec3f D_80BE0070 = { 1000.0f, 0.0f, 0.0f }; Gfx* D_80BE007C[] = { - object_al_DL_006598, object_al_DL_005920, object_al_DL_005878, - object_al_DL_0057D0, object_al_DL_005728, object_al_DL_005680, + gMadameAromaShawlMiddleDL, gMadameAromaShawlUpperDL, + gMadameAromaShawlLeftLowerMiddleDL, gMadameAromaShawlLeftLowerDL, + gMadameAromaShawlRightLowerMiddleDL, gMadameAromaShawlRightLowerDL, }; Actor* func_80BDE1A0(EnAl* this, PlayState* play, u8 arg0, s16 arg1) { @@ -780,7 +781,8 @@ void EnAl_Init(Actor* thisx, PlayState* play) { EnAl* this = THIS; ActorShape_Init(&this->actor.shape, 0.0f, NULL, 0.0f); - SkelAnime_InitFlex(play, &this->skelAnime, &object_al_Skel_00A0D8, NULL, this->jointTable, this->morphTable, 27); + SkelAnime_InitFlex(play, &this->skelAnime, &gMadameAromaSkel, NULL, this->jointTable, this->morphTable, + MADAME_AROMA_LIMB_MAX); this->unk_4F8 = -1; func_80BDE27C(this, 1); Collider_InitAndSetCylinder(play, &this->unk_310, &this->actor, &sCylinderInit); @@ -817,16 +819,16 @@ void EnAl_Update(Actor* thisx, PlayState* play) { s32 EnAl_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, Actor* thisx) { switch (limbIndex) { - case 3: - case 11: - case 12: - case 13: - case 14: - case 15: + case MADAME_AROMA_LIMB_SHAWL_MIDDLE: + case MADAME_AROMA_LIMB_SHAWL_UPPER: + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER_MIDDLE: + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER: + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER_MIDDLE: + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER: *dList = NULL; break; - case 16: + case MADAME_AROMA_LIMB_HEAD: break; } return false; @@ -836,31 +838,31 @@ void EnAl_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, EnAl* this = THIS; switch (limbIndex) { - case 3: + case MADAME_AROMA_LIMB_SHAWL_MIDDLE: Matrix_Get(&this->unk_190[0]); break; - case 11: + case MADAME_AROMA_LIMB_SHAWL_UPPER: Matrix_Get(&this->unk_190[1]); break; - case 12: + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER_MIDDLE: Matrix_Get(&this->unk_190[2]); break; - case 13: + case MADAME_AROMA_LIMB_SHAWL_LEFT_LOWER: Matrix_Get(&this->unk_190[3]); break; - case 14: + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER_MIDDLE: Matrix_Get(&this->unk_190[4]); break; - case 15: + case MADAME_AROMA_LIMB_SHAWL_RIGHT_LOWER: Matrix_Get(&this->unk_190[5]); break; - case 16: + case MADAME_AROMA_LIMB_HEAD: Matrix_MultVec3f(&D_80BE0070, &this->actor.focus.pos); Math_Vec3s_Copy(&this->actor.focus.rot, &this->actor.world.rot); break; diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index b8a69680bc..025c03c590 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -16930,14 +16930,14 @@ 0x80C1B9D4:("func_80C1B9D4",), 0x80C1BAC8:("EnFall2_Update",), 0x80C1BAEC:("EnFall2_Draw",), - 0x80C1BD90:("func_80C1BD90",), + 0x80C1BD90:("DmAl_ChangeAnimation",), 0x80C1BDD8:("func_80C1BDD8",), 0x80C1BF08:("DmAl_Init",), 0x80C1BFB8:("DmAl_Destroy",), 0x80C1BFC8:("DmAl_Update",), - 0x80C1C028:("func_80C1C028",), - 0x80C1C064:("func_80C1C064",), - 0x80C1C11C:("func_80C1C11C",), + 0x80C1C028:("DmAl_OverrideLimbDraw",), + 0x80C1C064:("DmAl_PostLimbDraw",), + 0x80C1C11C:("DmAl_TransformLimbDraw",), 0x80C1C130:("DmAl_Draw",), 0x80C1C410:("func_80C1C410",), 0x80C1C4D8:("func_80C1C4D8",), diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index 53849e442a..d981b96edb 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -16582,7 +16582,7 @@ 0x80C1C250:("Dm_Al_InitVars","UNK_TYPE1","",0x1), 0x80C1C270:("D_80C1C270","UNK_TYPE1","",0x1), 0x80C1C280:("D_80C1C280","UNK_TYPE4","",0x4), - 0x80C1C294:("D_80C1C294","UNK_TYPE4","",0x4), + 0x80C1C294:("sDlists","UNK_TYPE4","",0x4), 0x80C1C2AC:("D_80C1C2AC","UNK_TYPE1","",0x1), 0x80C1C2B0:("jtbl_80C1C2B0","UNK_PTR","",0x4), 0x80C1C2E4:("jtbl_80C1C2E4","UNK_PTR","",0x4),