From 9d807972512691b903db3df1cef47d55a3940c88 Mon Sep 17 00:00:00 2001 From: Maide <34639600+Kelebek1@users.noreply.github.com> Date: Sun, 8 Aug 2021 17:02:34 +0100 Subject: [PATCH] En_Dnb (#236) * En_Dnb * NBS * PR --- include/variables.h | 18 +- spec | 3 +- src/overlays/actors/ovl_En_Dnb/z_en_dnb.c | 288 ++++++++++++++++++++-- src/overlays/actors/ovl_En_Dnb/z_en_dnb.h | 33 ++- src/overlays/actors/ovl_En_Fg/z_en_fg.c | 2 +- 5 files changed, 312 insertions(+), 32 deletions(-) diff --git a/include/variables.h b/include/variables.h index 5724e2259..f3643ef20 100644 --- a/include/variables.h +++ b/include/variables.h @@ -1672,7 +1672,7 @@ extern PadMgr* padmgrContext; extern UNK_PTR D_801D1540; extern f32 D_801D1570[13]; extern Vec3f D_801D15B0; -// extern UNK_TYPE4 D_801D15BC; +extern Vec3s D_801D15BC; extern RSPMatrix D_801D1DE0; extern MtxF D_801D1E20; extern UNK_PTR D_801D1E60; @@ -4019,14 +4019,14 @@ extern UNK_TYPE D_04055628; extern Gfx D_04057B10[]; extern Gfx D_04058BA0[]; extern Gfx D_04089070[]; -extern u64 D_0408DBE0[]; // gDust1Tex -extern u64 D_0408DFE0[]; // gDust2Tex -extern u64 D_0408E3E0[]; // gDust3Tex -extern u64 D_0408E7E0[]; // gDust4Tex -extern u64 D_0408EBE0[]; // gDust5Tex -extern u64 D_0408EFE0[]; // gDust6Tex -extern u64 D_0408F3E0[]; // gDust7Tex -extern u64 D_0408F7E0[]; // gDust8Tex +extern TexturePtr D_0408DBE0[]; // gDust1Tex +extern TexturePtr D_0408DFE0[]; // gDust2Tex +extern TexturePtr D_0408E3E0[]; // gDust3Tex +extern TexturePtr D_0408E7E0[]; // gDust4Tex +extern TexturePtr D_0408EBE0[]; // gDust5Tex +extern TexturePtr D_0408EFE0[]; // gDust6Tex +extern TexturePtr D_0408F3E0[]; // gDust7Tex +extern TexturePtr D_0408F7E0[]; // gDust8Tex extern UNK_TYPE D_04050550; extern UNK_TYPE D_04050648; extern UNK_TYPE D_040510B0; diff --git a/spec b/spec index 8577c2516..eb6d19dca 100644 --- a/spec +++ b/spec @@ -3042,8 +3042,7 @@ beginseg name "ovl_En_Dnb" compress include "build/src/overlays/actors/ovl_En_Dnb/z_en_dnb.o" - include "build/data/ovl_En_Dnb/ovl_En_Dnb.data.o" - include "build/data/ovl_En_Dnb/ovl_En_Dnb.reloc.o" + include "build/src/overlays/actors/ovl_En_Dnb/ovl_En_Dnb_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c index 8cd49b1fa..9257f0205 100644 --- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c +++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.c @@ -1,3 +1,9 @@ +/* + * File: z_en_dnb.c + * Overlay: ovl_En_Dnb + * Description: + */ + #include "z_en_dnb.h" #define FLAGS 0x000000B0 @@ -9,7 +15,16 @@ void EnDnb_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnDnb_Update(Actor* thisx, GlobalContext* globalCtx); void EnDnb_Draw(Actor* thisx, GlobalContext* globalCtx); -#if 0 +s32 func_80A507C0(EnDnbUnkStruct* arg0, Vec3f arg1, Vec3f arg2, u8 arg3, f32 arg4, f32 arg5); +s32 func_80A5086C(EnDnbUnkStruct* arg0); +s32 func_80A50950(EnDnbUnkStruct* arg0, GlobalContext* globalCtx); + +extern Gfx D_06000000[]; +extern Gfx D_06000020[]; +extern Gfx D_06004638[]; +extern Vec3s D_06004710[]; +extern CollisionHeader D_06004D8C; + const ActorInit En_Dnb_InitVars = { ACTOR_EN_DNB, ACTORCAT_BG, @@ -22,34 +37,271 @@ const ActorInit En_Dnb_InitVars = { (ActorFunc)EnDnb_Draw, }; -#endif +void func_80A4FDD0(EnDnbParticle* particle, EnDnb* this, s16* alloc, s32 idx) { + Vec3f sp1C; + s32 idx2 = idx * 3; -extern UNK_TYPE D_06000020; -extern UNK_TYPE D_06004638; -extern UNK_TYPE D_06004D8C; + sp1C.x = alloc[idx2 + 0] + this->dyna.actor.world.pos.x; + sp1C.y = alloc[idx2 + 1] + this->dyna.actor.world.pos.y; + sp1C.z = alloc[idx2 + 2] + this->dyna.actor.world.pos.z; + particle->unk_00 = sp1C; + particle->unk_0C = sp1C; + particle->unk_24 = Math_Vec3f_Yaw(&this->dyna.actor.world.pos, &sp1C); + particle->unk_18 = D_801D15BC; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A4FDD0.s") +s32 func_80A4FEBC(EnDnbParticle* particle, f32 arg1) { + s32 ret = false; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A4FEBC.s") + if ((DECR(particle->unk_26) == 0) && (arg1 < particle->unk_0C.y)) { + Math_ApproachF(&particle->unk_30, 1.0f, 0.4f, 1.0f); + particle->unk_2C += particle->unk_34; + particle->unk_0C.x += particle->unk_30 * Math_SinS(particle->unk_24); + particle->unk_0C.z += particle->unk_30 * Math_CosS(particle->unk_24); + particle->unk_0C.y += particle->unk_2C; + if (particle->unk_0C.y <= arg1) { + particle->unk_0C.y = arg1; + } + particle->unk_18.x += particle->unk_1E.x; + particle->unk_18.y += particle->unk_1E.y; + particle->unk_18.z += particle->unk_1E.z; + ret = true; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A4FFE8.s") + return ret; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A500F8.s") +void func_80A4FFE8(EnDnbParticle* particle, s16 arg1) { + particle->unk_0C = particle->unk_00; + particle->unk_1E.x = (Rand_ZeroOne() - 0.5f) * 400.0f; + particle->unk_1E.y = (Rand_ZeroOne() - 0.5f) * 400.0f; + particle->unk_1E.z = (Rand_ZeroOne() - 0.5f) * 400.0f; + particle->unk_18 = D_801D15BC; + particle->unk_30 = 40.0f; + particle->unk_2C = 0.0f; + particle->unk_26 = arg1; + particle->unk_34 = (Rand_ZeroOne() * -2.0f) - 2.0f; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/EnDnb_Init.s") +s32 func_80A500F8(EnDnb* this) { + static Vec3f D_80A50CB0 = { 0.0f, 0.0f, 1000.0f }; + Actor* actor = &this->dyna.actor; + Vec3f spA8 = D_801D15B0; + Vec3f sp9C; + s32 i; + f32 temp_f20; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/EnDnb_Destroy.s") + for (i = 0; i < 16; i++) { + Lib_Vec3f_TranslateAndRotateY(&actor->world.pos, i * 4096, &D_80A50CB0, &spA8); + temp_f20 = Rand_ZeroOne() * 240.0f; + sp9C.x = Math_SinS(i * 4096) * temp_f20; + sp9C.z = Math_CosS(i * 4096) * temp_f20; + sp9C.y = Rand_ZeroOne() * 180.0f; + func_80A507C0(this->unk_0D38, spA8, sp9C, 16, 50.0f, 30.0f); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/EnDnb_Update.s") + return i; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A50510.s") +void EnDnb_Init(Actor* thisx, GlobalContext* globalCtx) { + EnDnb* this = THIS; + s32 i; + s16* alloc; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A5063C.s") + BcCheck3_BgActorInit(&this->dyna, 1); + BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06004D8C); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/EnDnb_Draw.s") + alloc = (s16*)Lib_SegmentedToVirtual(D_06004710); + for (i = 0; i < ARRAY_COUNT(this->particles); i++) { + func_80A4FDD0(&this->particles[i], this, alloc, i); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A507C0.s") + Actor_SetScale(&this->dyna.actor, 1.0f); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A5086C.s") +void EnDnb_Destroy(Actor* thisx, GlobalContext* globalCtx) { + EnDnb* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_En_Dnb/func_80A50950.s") + BgCheck_RemoveActorMesh(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId); +} + +void EnDnb_Update(Actor* thisx, GlobalContext* globalCtx) { + EnDnb* this = THIS; + s32 i; + + if (this->unk_0D30 == 0) { + for (i = 0; i < ARRAY_COUNT(this->particles); i++) { + func_80A4FFE8(&this->particles[i], ((53 - i) / 18) * 4); + } + + for (i = 0; i < ARRAY_COUNT(this->unk_0D38); i++) { + this->unk_0D38[i].isEnabled = false; + } + this->unk_0D32 = 20; + this->unk_0D30 = 100; + } else if (DECR(this->unk_0D32) == 0) { + if ((DECR(this->unk_0D34) == 0) && (this->unk_0D30 >= 21)) { + this->unk_0D34 = 5; + func_80A500F8(this); + } + + for (i = 0; i < ARRAY_COUNT(this->particles); i++) { + func_80A4FEBC(&this->particles[i], this->dyna.actor.world.pos.y); + } + + this->unk_0D30--; + } + func_80A5086C(this->unk_0D38); +} + +void func_80A50510(EnDnb* this, GlobalContext* globalCtx) { + s32 i; + Gfx** gfx = Lib_SegmentedToVirtual(D_06004638); + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C2DC(globalCtx->state.gfxCtx); + + for (i = 0; i < ARRAY_COUNT(this->particles); i++) { + SysMatrix_StatePush(); + SysMatrix_InsertTranslation(this->particles[i].unk_0C.x, this->particles[i].unk_0C.y, + this->particles[i].unk_0C.z, MTXMODE_NEW); + SysMatrix_InsertXRotation_s(this->particles[i].unk_18.x, MTXMODE_APPLY); + Matrix_RotateY(this->particles[i].unk_18.y, MTXMODE_APPLY); + SysMatrix_InsertZRotation_s(this->particles[i].unk_18.z, MTXMODE_APPLY); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, gfx[i]); + + SysMatrix_StatePop(); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +void func_80A5063C(EnDnb* this, GlobalContext* globalCtx) { + s32 i; + Gfx** gfx = Lib_SegmentedToVirtual(D_06004638); + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C28C(globalCtx->state.gfxCtx); + + for (i = 0; i < ARRAY_COUNT(this->particles); i++) { + SysMatrix_StatePush(); + SysMatrix_InsertTranslation(this->particles[i].unk_0C.x, this->particles[i].unk_0C.y, + this->particles[i].unk_0C.z, MTXMODE_NEW); + SysMatrix_InsertXRotation_s(this->particles[i].unk_18.x, MTXMODE_APPLY); + Matrix_RotateY(this->particles[i].unk_18.y, MTXMODE_APPLY); + SysMatrix_InsertZRotation_s(this->particles[i].unk_18.z, MTXMODE_APPLY); + + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, gfx[i]); + + SysMatrix_StatePop(); + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); +} + +void EnDnb_Draw(Actor* thisx, GlobalContext* globalCtx) { + EnDnb* this = THIS; + + if (globalCtx->actorCtx.unk4 != 0) { + func_80A50510(this, globalCtx); + } else { + func_80A5063C(this, globalCtx); + } + func_80A50950(this->unk_0D38, globalCtx); +} + +s32 func_80A507C0(EnDnbUnkStruct* arg0, Vec3f arg1, Vec3f arg2, u8 arg3, f32 arg4, f32 arg5) { + s32 i; + s32 ret = 0; + + for (i = 0; i < 256; i++, arg0++) { + if (arg0->isEnabled == false) { + arg0->isEnabled = true; + arg0->unk_01 = arg3; + arg0->unk_02 = arg3; + arg0->unk_0C = arg1; + arg0->unk_18 = arg2; + arg0->unk_04 = arg4; + arg0->unk_08 = arg5; + arg0->unk_24 = 255.0f; + ret = 1; + break; + } + } + return ret; +} + +s32 func_80A5086C(EnDnbUnkStruct* arg0) { + s32 count = 0; + s32 i; + + for (i = 0; i < 256; i++, arg0++) { + if (arg0->isEnabled == true) { + count++; + if (arg0->unk_01 != 0) { + arg0->unk_0C.x += arg0->unk_18.x; + arg0->unk_0C.y += arg0->unk_18.y; + arg0->unk_0C.z += arg0->unk_18.z; + arg0->unk_01 -= 1; + } else { + arg0->isEnabled = false; + } + } + } + + return count; +} + +s32 func_80A50950(EnDnbUnkStruct* arg0, GlobalContext* globalCtx2) { + static TexturePtr D_80A50CBC[] = { + D_0408F7E0, D_0408F3E0, D_0408EFE0, D_0408EBE0, D_0408E7E0, D_0408E3E0, D_0408DFE0, D_0408DBE0, + }; + GlobalContext* globalCtx = globalCtx2; + s32 isGfxSetup = false; + s32 sp5C = 0; + s32 idx; + s32 i; + + OPEN_DISPS(globalCtx->state.gfxCtx); + + func_8012C2DC(globalCtx->state.gfxCtx); + + for (i = 0; i < 256; i++, arg0++) { + if (arg0->isEnabled == 1) { + if (!isGfxSetup) { + POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0); + gSPDisplayList(POLY_XLU_DISP++, D_06000000); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 255, 0); + isGfxSetup = true; + } + SysMatrix_StatePush(); + + if (1) {}; + arg0->unk_24 = (arg0->unk_01 / (f32)arg0->unk_02) * 255.0f; + + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (u8)arg0->unk_24); + + SysMatrix_InsertTranslation(arg0->unk_0C.x, arg0->unk_0C.y, arg0->unk_0C.z, MTXMODE_NEW); + Matrix_Scale(arg0->unk_04, arg0->unk_04, 1.0f, MTXMODE_APPLY); + SysMatrix_NormalizeXYZ(&globalCtx->mf_187FC); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + idx = (arg0->unk_01 / (f32)arg0->unk_02) * 8.0f; + gSPSegment(POLY_XLU_DISP++, 0x08, Lib_SegmentedToVirtual(D_80A50CBC[idx])); + gSPDisplayList(POLY_XLU_DISP++, D_06000020); + + SysMatrix_StatePop(); + sp5C += 1; + } + } + + CLOSE_DISPS(globalCtx->state.gfxCtx); + + return sp5C; +} diff --git a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.h b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.h index b33afb484..d5ec9554a 100644 --- a/src/overlays/actors/ovl_En_Dnb/z_en_dnb.h +++ b/src/overlays/actors/ovl_En_Dnb/z_en_dnb.h @@ -5,9 +5,38 @@ struct EnDnb; +typedef struct { + /* 0x00 */ Vec3f unk_00; + /* 0x0C */ Vec3f unk_0C; + /* 0x18 */ Vec3s unk_18; + /* 0x1E */ Vec3s unk_1E; + /* 0x24 */ s16 unk_24; + /* 0x26 */ s16 unk_26; + /* 0x28 */ UNK_TYPE1 unk_28[0x4]; + /* 0x2C */ f32 unk_2C; + /* 0x30 */ f32 unk_30; + /* 0x34 */ f32 unk_34; +} EnDnbParticle; // size = 0x38 + +typedef struct { + /* 0x00 */ u8 isEnabled; + /* 0x01 */ u8 unk_01; + /* 0x02 */ u8 unk_02; + /* 0x04 */ f32 unk_04; + /* 0x08 */ f32 unk_08; + /* 0x0C */ Vec3f unk_0C; + /* 0x18 */ Vec3f unk_18; + /* 0x24 */ f32 unk_24; +} EnDnbUnkStruct; // size = 0x28 + typedef struct EnDnb { - /* 0x0000 */ Actor actor; - /* 0x0144 */ char unk_0144[0x33F4]; + /* 0x0000 */ DynaPolyActor dyna; + /* 0x015C */ UNK_TYPE1 unk_015C[0x4]; + /* 0x0160 */ EnDnbParticle particles[54]; + /* 0x0D30 */ s16 unk_0D30; + /* 0x0D32 */ s16 unk_0D32; + /* 0x0D34 */ s16 unk_0D34; + /* 0x0D38 */ EnDnbUnkStruct unk_0D38[256]; } EnDnb; // size = 0x3538 extern const ActorInit En_Dnb_InitVars; diff --git a/src/overlays/actors/ovl_En_Fg/z_en_fg.c b/src/overlays/actors/ovl_En_Fg/z_en_fg.c index 791e31151..3b94a5732 100644 --- a/src/overlays/actors/ovl_En_Fg/z_en_fg.c +++ b/src/overlays/actors/ovl_En_Fg/z_en_fg.c @@ -450,7 +450,7 @@ void EnFg_UpdateDust(EnFgEffectDust* dustEffect) { } } -u64* sDustTex[] = { +TexturePtr sDustTex[] = { D_0408F7E0, D_0408F3E0, D_0408EFE0, D_0408EBE0, D_0408E7E0, D_0408E3E0, D_0408DFE0, D_0408DBE0, };