From 6ff53e448b669b2894f543868367a4a65ebf8a69 Mon Sep 17 00:00:00 2001 From: SonicDcer <96613413+sonicdcer@users.noreply.github.com> Date: Fri, 30 Sep 2022 11:50:59 -0300 Subject: [PATCH] ovl_Oceff_Wipe OK (#1008) * ovl_Oceff_Wipe Decompiled * format * format * pr review * renaming * renamings * renamings * magic * pr review --- assets/xml/overlays/ovl_Oceff_Wipe.xml | 10 ++ spec | 4 +- .../actors/ovl_Oceff_Wipe/z_oceff_wipe.c | 99 +++++++++++++++++-- .../actors/ovl_Oceff_Wipe/z_oceff_wipe.h | 7 +- 4 files changed, 110 insertions(+), 10 deletions(-) create mode 100644 assets/xml/overlays/ovl_Oceff_Wipe.xml diff --git a/assets/xml/overlays/ovl_Oceff_Wipe.xml b/assets/xml/overlays/ovl_Oceff_Wipe.xml new file mode 100644 index 0000000000..17a056175a --- /dev/null +++ b/assets/xml/overlays/ovl_Oceff_Wipe.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/spec b/spec index 0b500363a4..6b4395bb1b 100644 --- a/spec +++ b/spec @@ -1730,9 +1730,7 @@ beginseg name "ovl_Oceff_Wipe" compress include "build/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.o" - include "build/data/ovl_Oceff_Wipe/ovl_Oceff_Wipe.data.o" - include "build/data/ovl_Oceff_Wipe/ovl_Oceff_Wipe.bss.o" - include "build/data/ovl_Oceff_Wipe/ovl_Oceff_Wipe.reloc.o" + include "build/src/overlays/actors/ovl_Oceff_Wipe/ovl_Oceff_Wipe_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c index 661c13a1b0..ef1fa10350 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c +++ b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.c @@ -15,7 +15,6 @@ void OceffWipe_Destroy(Actor* thisx, PlayState* play); void OceffWipe_Update(Actor* thisx, PlayState* play); void OceffWipe_Draw(Actor* thisx, PlayState* play); -#if 0 const ActorInit Oceff_Wipe_InitVars = { ACTOR_OCEFF_WIPE, ACTORCAT_ITEMACTION, @@ -28,12 +27,100 @@ const ActorInit Oceff_Wipe_InitVars = { (ActorFunc)OceffWipe_Draw, }; -#endif +UNK_TYPE4 D_80977200; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe/OceffWipe_Init.s") +void OceffWipe_Init(Actor* thisx, PlayState* play) { + OceffWipe* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe/OceffWipe_Destroy.s") + Actor_SetScale(&this->actor, 0.1f); + this->counter = 0; + this->actor.world.pos = GET_ACTIVE_CAM(play)->eye; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe/OceffWipe_Update.s") +void OceffWipe_Destroy(Actor* thisx, PlayState* play) { + OceffWipe* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Oceff_Wipe/OceffWipe_Draw.s") + Magic_Reset(play); + play->msgCtx.unk120B0 = 0; +} + +void OceffWipe_Update(Actor* thisx, PlayState* play) { + OceffWipe* this = THIS; + + this->actor.world.pos = GET_ACTIVE_CAM(play)->eye; + if (this->counter < 100) { + this->counter++; + } else { + Actor_MarkForDeath(&this->actor); + } +} + +#include "assets/overlays/ovl_Oceff_Wipe/ovl_Oceff_Wipe.c" + +static u8 sAlphaIndices[] = { + 0x01, 0x10, 0x22, 0x01, 0x20, 0x12, 0x01, 0x20, 0x12, 0x01, + 0x10, 0x22, 0x01, 0x20, 0x12, 0x01, 0x12, 0x21, 0x01, 0x02, +}; + +void OceffWipe_Draw(Actor* thisx, PlayState* play) { + u32 scroll = play->state.frames & 0xFF; + OceffWipe* this = THIS; + f32 z; + s32 pad; + u8 alphaTable[3]; + s32 i; + Vec3f eye = GET_ACTIVE_CAM(play)->eye; + Vtx* vtxPtr; + Vec3f quakeOffset; + + Camera_GetQuakeOffset(&quakeOffset, GET_ACTIVE_CAM(play)); + + OPEN_DISPS(play->state.gfxCtx); + + if (this->counter < 32) { + z = Math_SinS(this->counter << 9) * 1360.0f; + } else { + z = 1360.0f; + } + + if (this->counter >= 80) { + alphaTable[0] = 0; + alphaTable[1] = (100 - this->counter) * 8; + alphaTable[2] = (100 - this->counter) * 12; + } else { + alphaTable[0] = 0; + alphaTable[1] = 160; + alphaTable[2] = 255; + } + + for (i = 0; i < 20; i++) { + vtxPtr = sSongOfTimeFrustumVtx; + vtxPtr[i * 2 + 0].v.cn[3] = alphaTable[(sAlphaIndices[i] & 0xF0) >> 4]; + vtxPtr[i * 2 + 1].v.cn[3] = alphaTable[sAlphaIndices[i] & 0xF]; + } + + func_8012C2DC(play->state.gfxCtx); + + Matrix_Translate(eye.x + quakeOffset.x, eye.y + quakeOffset.y, eye.z + quakeOffset.z, MTXMODE_NEW); + Matrix_Scale(0.1f, 0.1f, 0.1f, MTXMODE_APPLY); + Matrix_ReplaceRotation(&play->billboardMtxF); + Matrix_RotateXS(0x708, MTXMODE_APPLY); + Matrix_Translate(0.0f, 0.0f, -z, MTXMODE_APPLY); + + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + + if (this->actor.params != OCEFF_WIPE_ZL) { + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 170, 255, 255, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 0, 150, 255, 128); + } else { + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 200, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 100, 0, 255, 128); + } + + gSPDisplayList(POLY_XLU_DISP++, sSongOfTimeFrustumMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0 - scroll, scroll * -2, 32, + 32, 1, 0 - scroll, scroll * -2, 32, 32)); + gSPDisplayList(POLY_XLU_DISP++, sSongOfTimeFrustumModelDL); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.h b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.h index 5b7e348375..6828c996d3 100644 --- a/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.h +++ b/src/overlays/actors/ovl_Oceff_Wipe/z_oceff_wipe.h @@ -3,11 +3,16 @@ #include "global.h" +typedef enum { + /* 0x0 */ OCEFF_WIPE_ZL, + /* 0x1 */ OCEFF_WIPE_SOT +} OceffWipeType; + struct OceffWipe; typedef struct OceffWipe { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x4]; + /* 0x144 */ s16 counter; } OceffWipe; // size = 0x148 extern const ActorInit Oceff_Wipe_InitVars;