* En_Dnb

* NBS

* PR
This commit is contained in:
Maide
2021-08-08 12:02:34 -04:00
committed by GitHub
parent 12bd420f7b
commit 9d80797251
5 changed files with 312 additions and 32 deletions
+9 -9
View File
@@ -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;
+1 -2
View File
@@ -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
+270 -18
View File
@@ -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;
}
+31 -2
View File
@@ -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;
+1 -1
View File
@@ -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,
};