From 1713e8a97d7fa550d0a4be63ee95c1a421816836 Mon Sep 17 00:00:00 2001 From: Connor Anderson Date: Wed, 29 Sep 2021 00:50:04 +0000 Subject: [PATCH] ovl_En_Ending_Hero6 OK (#333) * All functions in z_en_ending_hero6.c matching * Add data to z_en_ending_hero6.c * Remove duplicate declarations * Add symbols to undefined_syms.txt * Address initial PR comments * Add heading, rename variables, and remove U suffix * Further variable renamings according to PR suggestions --- spec | 3 +- .../ovl_En_Ending_Hero6/z_en_ending_hero6.c | 170 ++++++++++++++++-- .../ovl_En_Ending_Hero6/z_en_ending_hero6.h | 13 +- tools/disasm/variables.txt | 14 +- undefined_syms.txt | 26 +++ 5 files changed, 204 insertions(+), 22 deletions(-) diff --git a/spec b/spec index 2ecd6ccbd9..222c54f222 100644 --- a/spec +++ b/spec @@ -5518,8 +5518,7 @@ beginseg name "ovl_En_Ending_Hero6" compress include "build/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.o" - include "build/data/ovl_En_Ending_Hero6/ovl_En_Ending_Hero6.data.o" - include "build/data/ovl_En_Ending_Hero6/ovl_En_Ending_Hero6.reloc.o" + include "build/src/overlays/actors/ovl_En_Ending_Hero6/ovl_En_Ending_Hero6_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c index 048e4c7a28..cfd5966466 100644 --- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c +++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.c @@ -1,3 +1,9 @@ +/* + * File: z_en_ending_hero6.c + * Overlay: ovl_En_Ending_Hero6 + * Description: + */ + #include "z_en_ending_hero6.h" #define FLAGS 0x00000009 @@ -9,9 +15,40 @@ void EnEndingHero6_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnEndingHero6_Update(Actor* thisx, GlobalContext* globalCtx); void EnEndingHero6_Draw(Actor* thisx, GlobalContext* globalCtx); -void func_80C23E18(EnEndingHero6* this, GlobalContext* globalCtx); +void EnEndingHero6_InitSkelAnime(EnEndingHero6* this, s32 npcIndex); +void EnEndingHero6_SetupIdle(EnEndingHero6* this); +void EnEndingHero6_Idle(EnEndingHero6* this, GlobalContext* globalCtx); + +extern FlexSkeletonHeader D_0600B0CC; // object_dt +extern FlexSkeletonHeader D_06007908; // object_bai +extern FlexSkeletonHeader D_06007150; // object_toryo +extern FlexSkeletonHeader D_0600D640; // object_sdn +extern FlexSkeletonHeader D_0600A850; // object_daiku + +extern AnimationHeader D_06000BE0; // object_dt +extern AnimationHeader D_060011C0; // object_bai +extern AnimationHeader D_06000E50; // object_toryo +extern AnimationHeader D_06002A84; // object_sdn +extern AnimationHeader D_06002FA0; // object_daiku + +// object_daiku +extern Gfx D_060070C0[]; +extern Gfx D_06006FB0[]; +extern Gfx D_06006E80[]; +extern Gfx D_06006D70[]; +extern Gfx D_0600A390_dl[]; + +// object_dt +extern TexturePtr D_06007350; +extern TexturePtr D_06009590; +extern TexturePtr D_06009F90; +extern TexturePtr D_0600A790; +extern TexturePtr D_0600AB90; + +extern TexturePtr D_06007750; +extern TexturePtr D_0600A390_tex; +extern TexturePtr D_0600A490; -#if 0 const ActorInit En_Ending_Hero6_InitVars = { ACTOR_EN_ENDING_HERO6, ACTORCAT_NPC, @@ -24,20 +61,131 @@ const ActorInit En_Ending_Hero6_InitVars = { (ActorFunc)EnEndingHero6_Draw, }; -#endif +static FlexSkeletonHeader* sSkeletons[] = { &D_0600B0CC, &D_06007908, &D_06007150, &D_0600D640, &D_0600A850, + &D_0600A850, &D_0600A850, &D_0600A850, &D_0600A850 }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/EnEndingHero6_Init.s") +static AnimationHeader* sAnimations[] = { &D_06000BE0, &D_060011C0, &D_06000E50, &D_06002A84, &D_06002FA0, + &D_06002FA0, &D_06002FA0, &D_06002FA0, &D_06002FA0 }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/EnEndingHero6_Destroy.s") +static s32 sLimbCounts[] = { 15, 20, 17, 17, 17, 17, 17, 17, 17 }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/func_80C23D60.s") +void EnEndingHero6_Init(Actor* thisx, GlobalContext* globalCtx) { + EnEndingHero6* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/func_80C23DDC.s") + this->actor.colChkInfo.mass = MASS_IMMOVABLE; + Actor_SetScale(&this->actor, 0.01f); + this->actor.targetMode = 6; + this->actor.gravity = -3.0f; + SkelAnime_InitSV(globalCtx, &this->skelAnime, sSkeletons[this->npcIndex], sAnimations[this->npcIndex], + this->jointTable, this->morphTable, sLimbCounts[this->npcIndex]); + ActorShape_Init(&this->actor.shape, 0.0f, func_800B3FC0, 25.0f); + EnEndingHero6_SetupIdle(this); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/func_80C23E18.s") +void EnEndingHero6_Destroy(Actor* thisx, GlobalContext* globalCtx) { +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/EnEndingHero6_Update.s") +void EnEndingHero6_InitSkelAnime(EnEndingHero6* this, s32 npcIndex) { + this->animIndex = npcIndex; + this->frameCount = SkelAnime_GetFrameCount(&sAnimations[npcIndex]->common); + SkelAnime_ChangeAnim(&this->skelAnime, sAnimations[this->animIndex], 1.0f, 0.f, this->frameCount, 0, 0.0f); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/func_80C23F14.s") +void EnEndingHero6_SetupIdle(EnEndingHero6* this) { + EnEndingHero6_InitSkelAnime(this, this->npcIndex); + this->isIdle = 1; + this->actionFunc = EnEndingHero6_Idle; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Ending_Hero6/EnEndingHero6_Draw.s") +void EnEndingHero6_Idle(EnEndingHero6* this, GlobalContext* globalCtx) { + SkelAnime_FrameUpdateMatrix(&this->skelAnime); +} + +void EnEndingHero6_Update(Actor* thisx, GlobalContext* globalCtx) { + EnEndingHero6* this = THIS; + + if (this->timer != 0) { + this->timer--; + } + + this->actor.shape.rot.y = this->actor.world.rot.y; + + if (this->blinkTimer == 0) { + this->eyeState++; + if (this->eyeState >= 3) { + this->eyeState = 0; + this->blinkTimer = (s16)Rand_ZeroFloat(60.0f) + 20; + } + } + + this->actionFunc(this, globalCtx); + Actor_SetVelocityAndMoveYRotationAndGravity(&this->actor); + Actor_UpdateBgCheckInfo(globalCtx, &this->actor, 20.0f, 20.0f, 50.0f, 0x1D); +} + +void EnEndingHero6_PostLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3s* rot, Actor* thisx) { + static Gfx* D_80C2426C[] = { D_060070C0, D_06006FB0, D_06006E80, D_06006D70, D_0600A390_dl }; + EnEndingHero6* this = THIS; + s32 index; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + if (this->npcIndex >= 4 && limbIndex == 15) { + index = this->npcIndex - 4; + gSPDisplayList(POLY_OPA_DISP++, D_80C2426C[index]); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +void EnEndingHero6_Draw(Actor* thisx, GlobalContext* globalCtx) { + static TexturePtr D_80C24280[] = { &D_06007350, &D_06009590, &D_06009F90, &D_0600A790, &D_0600AB90 }; + static TexturePtr D_80C24294[] = { &D_06007750, &D_0600A390_tex, &D_0600A490 }; + s32 pad; + EnEndingHero6* this = THIS; + s32 index = 0; + + if (this->isIdle == 1) { + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C28C(globalCtx->state.gfxCtx); + func_8012C2DC(globalCtx->state.gfxCtx); + + if (this->objectIndex >= 0 && Object_IsLoaded(&globalCtx->objectCtx, this->objectIndex)) { + gSPSegment(POLY_OPA_DISP++, 0x06, globalCtx->objectCtx.status[this->objectIndex].segment); + + switch (this->npcIndex) { + case 4: + gDPSetEnvColor(POLY_OPA_DISP++, 170, 10, 70, 255); + break; + case 5: + gDPSetEnvColor(POLY_OPA_DISP++, 170, 200, 255, 255); + break; + case 6: + gDPSetEnvColor(POLY_OPA_DISP++, 0, 230, 70, 255); + break; + case 7: + gDPSetEnvColor(POLY_OPA_DISP++, 200, 0, 150, 255); + break; + case 8: + gDPSetEnvColor(POLY_OPA_DISP++, 245, 155, 0, 255); + break; + } + + if (this->npcIndex == 0) { + gSPSegment(POLY_OPA_DISP++, 0x08, Lib_SegmentedToVirtual(D_80C24280[this->eyeState])); + + if (this->eyeState < 3) { + index = this->eyeState; + } + + gSPSegment(POLY_OPA_DISP++, 0x09, Lib_SegmentedToVirtual(D_80C24294[index])); + } + + SkelAnime_DrawSV(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, + this->skelAnime.dListCount, NULL, EnEndingHero6_PostLimbDraw, &this->actor); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); + } +} diff --git a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h index 2cbdb29801..4f8989634f 100644 --- a/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h +++ b/src/overlays/actors/ovl_En_Ending_Hero6/z_en_ending_hero6.h @@ -9,9 +9,18 @@ typedef void (*EnEndingHero6ActionFunc)(struct EnEndingHero6*, GlobalContext*); typedef struct EnEndingHero6 { /* 0x0000 */ Actor actor; - /* 0x0144 */ char unk_144[0x134]; + /* 0x0144 */ SkelAnime skelAnime; + /* 0x0188 */ Vec3s jointTable[20]; + /* 0x0200 */ Vec3s morphTable[20]; /* 0x0278 */ EnEndingHero6ActionFunc actionFunc; - /* 0x027C */ char unk_27C[0x18]; + /* 0x027C */ s32 animIndex; + /* 0x0280 */ s32 npcIndex; + /* 0x0284 */ s8 objectIndex; + /* 0x0286 */ s16 timer; + /* 0x0288 */ s16 blinkTimer; + /* 0x028A */ s16 eyeState; + /* 0x028C */ f32 frameCount; + /* 0x0290 */ s16 isIdle; } EnEndingHero6; // size = 0x294 extern const ActorInit En_Ending_Hero6_InitVars; diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index cc79d6fe8a..b12e417f1f 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -16988,13 +16988,13 @@ 0x80C23BD0:("En_Ending_Hero5_InitVars","UNK_TYPE1","",0x1), 0x80C23BF0:("D_80C23BF0","UNK_TYPE1","",0x1), 0x80C23C10:("jtbl_80C23C10","UNK_PTR","",0x4), - 0x80C241E0:("En_Ending_Hero6_InitVars","UNK_TYPE1","",0x1), - 0x80C24200:("D_80C24200","UNK_TYPE1","",0x1), - 0x80C24224:("D_80C24224","UNK_TYPE1","",0x1), - 0x80C24248:("D_80C24248","UNK_TYPE1","",0x1), - 0x80C2426C:("D_80C2426C","UNK_TYPE1","",0x1), - 0x80C24280:("D_80C24280","UNK_TYPE1","",0x1), - 0x80C24294:("D_80C24294","UNK_TYPE1","",0x1), + 0x80C241E0:("En_Ending_Hero6_InitVars","ActorInit","",0x20), + 0x80C24200:("D_80C24200","FlexSkeletonHeader*","[9]",0x24), + 0x80C24224:("D_80C24224","AnimationHeader*","[9]",0x24), + 0x80C24248:("D_80C24248","s32","[9]",0x24), + 0x80C2426C:("D_80C2426C","Gfx*","[5]",0x14), + 0x80C24280:("D_80C24280","TexturePtr","[5]",0x14), + 0x80C24294:("D_80C24294","TexturePtr","[3]",0xc), 0x80C242A0:("jtbl_80C242A0","UNK_PTR","",0x4), 0x80C250F0:("Dm_Gm_InitVars","UNK_TYPE1","",0x1), 0x80C25110:("D_80C25110","UNK_TYPE1","",0x1), diff --git a/undefined_syms.txt b/undefined_syms.txt index 78dfbc4923..57eb32e565 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -2089,6 +2089,32 @@ D_060070C0 = 0x060070C0; D_0600A390 = 0x0600A390; D_0600A850 = 0x0600A850; +// ovl_En_Ending_Hero6 + +D_0600B0CC = 0x0600B0CC; +D_06007908 = 0x06007908; +D_06007150 = 0x06007150; +D_0600D640 = 0x0600D640; +D_0600A850 = 0x0600A850; +D_06000BE0 = 0x06000BE0; +D_060011C0 = 0x060011C0; +D_06000E50 = 0x06000E50; +D_06002A84 = 0x06002A84; +D_06002FA0 = 0x06002FA0; +D_060070C0 = 0x060070C0; +D_06006FB0 = 0x06006FB0; +D_06006E80 = 0x06006E80; +D_06006D70 = 0x06006D70; +D_0600A390_dl = 0x0600A390; +D_06007350 = 0x06007350; +D_06009590 = 0x06009590; +D_06009F90 = 0x06009F90; +D_0600A790 = 0x0600A790; +D_0600AB90 = 0x0600AB90; +D_06007750 = 0x06007750; +D_0600A390_tex = 0x0600A390; +D_0600A490 = 0x0600A490; + // ovl_En_Estone D_06010240 = 0x06010240;