From 62b465b3ea7d9019294ff2d973470189bdaff3f1 Mon Sep 17 00:00:00 2001 From: Alejandro Asenjo <96613413+sonicdcer@users.noreply.github.com> Date: Sun, 16 Oct 2022 00:36:25 -0300 Subject: [PATCH] ovl_Bg_Dkjail_Ivy OK (#1014) * ovl_Bg_Dkjail_Ivy OK * Co-authored-by: petrie911 petrie911@users.noreply.github.com * xml * pr review * pr review * pos / vel / accel * format * angle * Update src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c Co-authored-by: EllipticEllipsis * in-function static * BgDkjailIvy_SetIdle * _WaitForCut * setup * pr review * Actor_Kill Co-authored-by: Anghelo Carvajal Co-authored-by: EllipticEllipsis --- assets/xml/objects/object_dkjail_obj.xml | 2 +- spec | 3 +- .../ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c | 182 +++++++++++++++--- .../ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h | 9 +- tools/disasm/functions.txt | 14 +- 5 files changed, 174 insertions(+), 36 deletions(-) diff --git a/assets/xml/objects/object_dkjail_obj.xml b/assets/xml/objects/object_dkjail_obj.xml index 219181c6db..ada181475e 100644 --- a/assets/xml/objects/object_dkjail_obj.xml +++ b/assets/xml/objects/object_dkjail_obj.xml @@ -1,6 +1,6 @@  - + diff --git a/spec b/spec index 3837f6b304..48c0983a0e 100644 --- a/spec +++ b/spec @@ -3388,8 +3388,7 @@ beginseg name "ovl_Bg_Dkjail_Ivy" compress include "build/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.o" - include "build/data/ovl_Bg_Dkjail_Ivy/ovl_Bg_Dkjail_Ivy.data.o" - include "build/data/ovl_Bg_Dkjail_Ivy/ovl_Bg_Dkjail_Ivy.reloc.o" + include "build/src/overlays/actors/ovl_Bg_Dkjail_Ivy/ovl_Bg_Dkjail_Ivy_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c index adeba93c8b..87adddbde1 100644 --- a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c +++ b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.c @@ -5,6 +5,8 @@ */ #include "z_bg_dkjail_ivy.h" +#include "assets/objects/gameplay_keep/gameplay_keep.h" +#include "assets/objects/object_dkjail_obj/object_dkjail_obj.h" #define FLAGS 0x00000000 @@ -15,7 +17,13 @@ void BgDkjailIvy_Destroy(Actor* thisx, PlayState* play); void BgDkjailIvy_Update(Actor* thisx, PlayState* play); void BgDkjailIvy_Draw(Actor* thisx, PlayState* play); -#if 0 +void BgDkjailIvy_SetupWaitForCut(BgDkjailIvy* this); +void BgDkjailIvy_WaitForCut(BgDkjailIvy* this, PlayState* play); +void BgDkjailIvy_SetupCutscene(BgDkjailIvy* this); +void BgDkjailIvy_BeginCutscene(BgDkjailIvy* this, PlayState* play); +void BgDkjailIvy_SetupFadeOut(BgDkjailIvy* this); +void BgDkjailIvy_FadeOut(BgDkjailIvy* this, PlayState* play); + const ActorInit Bg_Dkjail_Ivy_InitVars = { ACTOR_BG_DKJAIL_IVY, ACTORCAT_BG, @@ -28,47 +36,175 @@ const ActorInit Bg_Dkjail_Ivy_InitVars = { (ActorFunc)BgDkjailIvy_Draw, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_80ADE950 = { - { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK0, { 0x00000000, 0x00, 0x00 }, { 0x01000200, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, }, +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_ON | AC_TYPE_PLAYER, + OC1_NONE, + OC2_NONE, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0x01000200, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_NONE, + }, { 20, 80, 0, { 0, 0, 0 } }, }; -// static InitChainEntry sInitChain[] = { -static InitChainEntry D_80ADE98C[] = { +void BgDkjailIvy_IvyCutEffects(BgDkjailIvy* this, PlayState* play) { + static Gfx* sLeafDlists[] = { gKakeraLeafMiddle, gKakeraLeafTip }; + static s16 sLeafScales[] = { 110, 80, 60, 40 }; + f32 phi_fs0; + s32 i; + Vec3f spD4; + Vec3f pos; + Vec3f vel; + Vec3f accel; + s16 angle; + + Matrix_RotateYS(this->dyna.actor.home.rot.y, MTXMODE_NEW); + + for (i = 0, angle = 0; i < 50; i++, angle += 0x4E20) { + spD4.y = (i * (90.0f / 49.0f)) + 2.0f; + if (spD4.y < 45.0f) { + phi_fs0 = ((1.0f / 180.0f) * spD4.y) + 0.75f; + } else if (spD4.y < 90.0f) { + phi_fs0 = ((-1.0f / 180.0f) * spD4.y) + 1.25f; + } else { + phi_fs0 = ((-1.0f / 30.0f) * spD4.y) + 3.75f; + } + + spD4.x = Math_SinS(angle) * 40.0f * phi_fs0; + spD4.z = (Rand_ZeroOne() * 6.0f) - 3.0f; + + Matrix_MultVec3f(&spD4, &pos); + + vel.x = (Rand_ZeroOne() - 0.5f) + (pos.x * 0.075f); + vel.y = 2.0f * Rand_ZeroOne(); + vel.z = (Rand_ZeroOne() - 0.5f) + (pos.z * 0.075f); + + pos.x += this->dyna.actor.world.pos.x; + pos.y += this->dyna.actor.world.pos.y; + pos.z += this->dyna.actor.world.pos.z; + + EffectSsKakera_Spawn(play, &pos, &vel, &pos, -0x82, 0x40, 0x28, 0, 0, sLeafScales[i & 3], 0, 0, 44, -1, + GAMEPLAY_KEEP, sLeafDlists[(s32)Rand_Next() > 0]); + + if ((i > 20) && ((i % 2) != 0)) { + accel.x = (Rand_ZeroOne() - 0.5f) * 0.2f; + accel.y = (Rand_ZeroOne() * 0.02f) - 0.1f; + accel.z = (Rand_ZeroOne() - 0.5f) * 0.2f; + + func_800B12F0(play, &pos, &gZeroVec3f, &accel, ((Rand_Next() >> 26) + 10), (Rand_Next() >> 28), 50); + } + } +} + +static InitChainEntry sInitChain[] = { ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 200, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneDownward, 200, ICHAIN_CONTINUE), ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP), }; -#endif +void BgDkjailIvy_Init(Actor* thisx, PlayState* play) { + s32 pad; + BgDkjailIvy* this = THIS; -extern ColliderCylinderInit D_80ADE950; -extern InitChainEntry D_80ADE98C[]; + Actor_ProcessInitChain(&this->dyna.actor, sInitChain); + DynaPolyActor_Init(&this->dyna, 0); + Collider_InitCylinder(play, &this->collider); -extern UNK_TYPE D_06000080; -extern UNK_TYPE D_060011A8; + if (Flags_GetSwitch(play, BG_DKJAIL_GET_SWITCH(thisx))) { + Actor_Kill(&this->dyna.actor); + } else { + DynaPolyActor_LoadMesh(play, &this->dyna, &object_dkjail_obj_Colheader_0011A8); + Collider_SetCylinder(play, &this->collider, &this->dyna.actor, &sCylinderInit); + Collider_UpdateCylinder(&this->dyna.actor, &this->collider); + this->alpha = 255; + BgDkjailIvy_SetupWaitForCut(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE230.s") +void BgDkjailIvy_Destroy(Actor* thisx, PlayState* play) { + BgDkjailIvy* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Init.s") + DynaPoly_DeleteBgActor(play, &play->colCtx.dyna, this->dyna.bgId); + Collider_DestroyCylinder(play, &this->collider); +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Destroy.s") +void BgDkjailIvy_SetupWaitForCut(BgDkjailIvy* this) { + this->actionFunc = BgDkjailIvy_WaitForCut; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE6AC.s") +void BgDkjailIvy_WaitForCut(BgDkjailIvy* this, PlayState* play) { + if (this->collider.base.acFlags & AC_HIT) { + this->collider.base.acFlags &= ~AC_HIT; + this->dyna.actor.flags |= ACTOR_FLAG_10; + ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene); + BgDkjailIvy_SetupCutscene(this); + } else { + CollisionCheck_SetAC(play, &play->colChkCtx, &this->collider.base); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE6C0.s") +void BgDkjailIvy_SetupCutscene(BgDkjailIvy* this) { + this->actionFunc = BgDkjailIvy_BeginCutscene; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE734.s") +void BgDkjailIvy_BeginCutscene(BgDkjailIvy* this, PlayState* play) { + if (ActorCutscene_GetCanPlayNext(this->dyna.actor.cutscene)) { + ActorCutscene_StartAndSetUnkLinkFields(this->dyna.actor.cutscene, &this->dyna.actor); + this->fadeOutTimer = 50; + func_800C62BC(play, &play->colCtx.dyna, this->dyna.bgId); + Flags_SetSwitch(play, BG_DKJAIL_GET_SWITCH(&this->dyna.actor)); + BgDkjailIvy_IvyCutEffects(this, play); + Actor_PlaySfxAtPos(&this->dyna.actor, NA_SE_EV_GRASS_WALL_BROKEN); + BgDkjailIvy_SetupFadeOut(this); + } else { + ActorCutscene_SetIntentToPlay(this->dyna.actor.cutscene); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE748.s") +void BgDkjailIvy_SetupFadeOut(BgDkjailIvy* this) { + this->actionFunc = BgDkjailIvy_FadeOut; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE7E0.s") +void BgDkjailIvy_FadeOut(BgDkjailIvy* this, PlayState* play) { + if (this->alpha > 8) { + this->alpha -= 8; + } else { + this->alpha = 0; + this->dyna.actor.draw = NULL; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/func_80ADE7F4.s") + this->fadeOutTimer--; + if (this->fadeOutTimer <= 0) { + Actor_Kill(&this->dyna.actor); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Update.s") +void BgDkjailIvy_Update(Actor* thisx, PlayState* play) { + BgDkjailIvy* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Bg_Dkjail_Ivy/BgDkjailIvy_Draw.s") + this->actionFunc(this, play); +} + +void BgDkjailIvy_Draw(Actor* thisx, PlayState* play) { + BgDkjailIvy* this = THIS; + + OPEN_DISPS(play->state.gfxCtx); + + func_8012C2DC(play->state.gfxCtx); + + gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 255, 255, 255, this->alpha); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, &gDkjailIvyDL); + + CLOSE_DISPS(play->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h index c4d824dc09..edf87d662e 100644 --- a/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h +++ b/src/overlays/actors/ovl_Bg_Dkjail_Ivy/z_bg_dkjail_ivy.h @@ -3,15 +3,18 @@ #include "global.h" +#define BG_DKJAIL_GET_SWITCH(thisx) ((thisx)->params & 0x7F) + struct BgDkjailIvy; typedef void (*BgDkjailIvyActionFunc)(struct BgDkjailIvy*, PlayState*); typedef struct BgDkjailIvy { - /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x64]; + /* 0x000 */ DynaPolyActor dyna; + /* 0x15C */ ColliderCylinder collider; /* 0x1A8 */ BgDkjailIvyActionFunc actionFunc; - /* 0x1AC */ char unk_1AC[0x4]; + /* 0x1AC */ s8 fadeOutTimer; + /* 0x1AD */ u8 alpha; } BgDkjailIvy; // size = 0x1B0 extern const ActorInit Bg_Dkjail_Ivy_InitVars; diff --git a/tools/disasm/functions.txt b/tools/disasm/functions.txt index 276694be75..647cc3d79a 100644 --- a/tools/disasm/functions.txt +++ b/tools/disasm/functions.txt @@ -12330,15 +12330,15 @@ 0x80ADD7B4:("func_80ADD7B4",), 0x80ADD7CC:("EnSellnuts_TransformLimbDraw",), 0x80ADD8A4:("EnSellnuts_Draw",), - 0x80ADE230:("func_80ADE230",), + 0x80ADE230:("BgDkjailIvy_IvyCutEffects",), 0x80ADE5A4:("BgDkjailIvy_Init",), 0x80ADE664:("BgDkjailIvy_Destroy",), - 0x80ADE6AC:("func_80ADE6AC",), - 0x80ADE6C0:("func_80ADE6C0",), - 0x80ADE734:("func_80ADE734",), - 0x80ADE748:("func_80ADE748",), - 0x80ADE7E0:("func_80ADE7E0",), - 0x80ADE7F4:("func_80ADE7F4",), + 0x80ADE6AC:("BgDkjailIvy_SetupWaitForCut",), + 0x80ADE6C0:("BgDkjailIvy_WaitForCut",), + 0x80ADE734:("BgDkjailIvy_SetupCutscene",), + 0x80ADE748:("BgDkjailIvy_BeginCutscene",), + 0x80ADE7E0:("BgDkjailIvy_SetupFadeOut",), + 0x80ADE7F4:("BgDkjailIvy_FadeOut",), 0x80ADE850:("BgDkjailIvy_Update",), 0x80ADE874:("BgDkjailIvy_Draw",), 0x80ADEA70:("ObjVisiblock_Init",),